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

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

  • 编码filter,如Spring MVC UTF-8编码

  • 在Tomcat的server.xml中设置URIEncoding = UTF-8,如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来解决这个问题:

   encodingFilter org.springframework.web.filter.CharacterEncodingFilter  encoding UTF-8   forceEncoding true    encodingFilter /*  

但是同样的乱码。

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

  

即使我删除filter也适用于此。

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

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

谢谢!

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

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

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

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

  • POST请求的CharacterEncodingFilter

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