Tomcat的“URIEncoding”,编码过滤器和request.setCharacterEncoding有什么区别?

时间:2014-11-15 10:21:33

标签: java spring tomcat encoding 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方法,我猜解决方案可能会有所不同

有人可以解释一下我们应该针对什么样的问题采取什么样的差异编码解决方案?

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

  • useBodyEncodingForURI="true"告诉Tomcat在解码URI时使用为请求体配置的编码。因此,据我所知,如果您设置CharacterEncodingFilteruseBodyEncodingForURI="true",那么您不需要URIEncoding

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

  • CharacterEncodingFilter POST次请求

  • URIEncoding(或useBodyEncodingForURI="true"GET次请求