Tomcat的"URIEncoding",Encoding Filter和request.setCharacterEncode有什么区别


可能

有很多方法可以解决编码问题:

  • 编码过滤器,如 Spring MVC UTF-8 编码

  • 在 Tomcat 的服务器中设置 URIEncoding=UTF-8.xml ,就像 http://struts.apache.org/release/2.1.x/docs/how-to-support-utf-8-uriencoding-with-tomcat.html 一样。

  • request.setCharacterEncoding( utf-8 )

今天,我有一个问题,路径参数没有像

@ResponseBody
@RequestMapping(value="/context/method/{key}",method=RequestMethod.GET,produces = "application/json;charset=utf-8")
public String method(@PathVariable String key){
    logger.info("key="+key+"------------");
}

我可以看到密钥解码不好!如果我从前端传递一个"新浪"词,它将变得"æ°æµª".我编写以下代码来检查服务器是否正在使用"ISO-8859-1"对其进行解码:

public static void main(String args[]) throws UnsupportedEncodingException{
    String key="新浪";
    byte[] bytes=key.getBytes("UTF-8");
    String decode=new String(bytes,"ISO-8859-1");
    System.out.println(decode);
}

它以相同的输出"æ°æµª"出来。 因此,路径变量确实是用 ISO-8859-1 解码的。

然后我尝试在我的web.xml中添加一个过滤器来解决这个问题:

  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
 </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping> 

但同样是乱码。

直到我在下面设置我的server.xml

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"
           URIEncoding="UTF-8" useBodyEncodingForURI="true"   ----Here is Added
/>

即使我删除过滤器,它也适用于此。

但我仍然对编码问题感到非常困惑。除此之外,这只是GET方法,如果是POST方法,我想解决方案可能会有所不同

任何人都可以解释一下,我们应该对什么样的问题采取什么不同的编码解决方案?

谢谢!

  • CharacterEncodingFilter配置请求正文的编码。也就是说,它影响POST请求参数等的编码,但不影响GET参数的编码

  • URIEncoding用于指定 URI 的编码,因此它会影响GET参数

  • useBodyEncodingForURI="true"告诉 Tomcat 在解码 URI 时使用为请求正文配置的编码。所以,据我了解,如果你设置CharacterEncodingFilteruseBodyEncodingForURI="true"那么你不需要URIEncoding.

在实践中,您需要做两件事来解决参数编码可能出现的问题:

  • POST请求的CharacterEncodingFilter

  • URIEncoding(或useBodyEncodingForURI="true")用于GET请求

for tomcat7

  • 字符编码筛选器配置请求正文的编码。也就是说,它影响 POST 请求参数等的编码,但不影响 GET 参数的编码

  • useBodyEncodingForURI="true" 告诉tomcat使用CharacterEncoding(可以通过CharacterEncodingFilter设置)来解析QueryString。 它会影响 GET 请求参数。

  • URI编码为parset URI,默认值为ISO-8859-1。

对于雄猫8

  • 默认 UTF-8。

最新更新