Jas*_*key 6 java encoding spring tomcat utf-8
可能有很多方法可以解决编码问题:
编码过滤器,如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+"------------");
}
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方法,我想解决方案可能会有所不同
任何人都可以解释一下我们应该采取什么样的差异编码解决方案来解决什么样的问题?
谢谢!
CharacterEncodingFilter
配置请求正文的编码。即影响POST
请求参数等的编码,但不影响参数的GET
编码
URIEncoding
用于指定 URI 的编码,因此它会影响GET
参数
useBodyEncodingForURI="true"
告诉 Tomcat 在解码 URI 时使用为请求正文配置的编码。所以,据我了解,如果你设置了,CharacterEncodingFilter
那么useBodyEncodingForURI="true"
你就不需要URIEncoding
.
在实践中,您需要做两件事来解决参数编码可能出现的问题:
CharacterEncodingFilter
对于POST
请求
URIEncoding
(或useBodyEncodingForURI="true"
) 对于GET
请求
归档时间: |
|
查看次数: |
6906 次 |
最近记录: |