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

Jas*_*key 6 java encoding spring tomcat 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+"------------");
}
Run Code Online (Sandbox Code Playgroud)

我可以看到密钥被解码坏了!如果我"??"从前端传出一个字,它就会变成"æ°æµª".我编写以下代码来检查服务器是否使用"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);
}
Run Code Online (Sandbox Code Playgroud)

它出来的输出相同"æ°æµª".实际上,路径变量用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> 
Run Code Online (Sandbox Code Playgroud)

但是同样的乱码.

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

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"
           URIEncoding="UTF-8" useBodyEncodingForURI="true"   ----Here is Added
/>
Run Code Online (Sandbox Code Playgroud)

即使我删除过滤器也适用于此.

但我仍然对编码问题感到困惑.而且,这只是GET方法,如果是POST方法,我想解决方案可能会有所不同

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

谢谢!

axt*_*avt 3

  • CharacterEncodingFilter配置请求正文的编码。即影响POST请求参数等的编码,但不影响参数的GET编码

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

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

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

  • CharacterEncodingFilter对于POST请求

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