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时使用为请求主体配置的编码。 所以,据我所知,如果你设置CharacterEncodingFilter
和useBodyEncodingForURI="true"
那么你不需要URIEncoding
。
在实践中,您需要两件事来解决参数编码可能出现的问题:
-
POST
请求的CharacterEncodingFilter
-
用于
GET
请求的URIEncoding
(或useBodyEncodingForURI="true"
)