首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat的"URIEncoding“、编码滤波器和request.setCharacterEncoding有什么区别?

Tomcat的"URIEncoding“、编码滤波器和request.setCharacterEncoding有什么区别?
EN

Stack Overflow用户
提问于 2014-11-15 10:21:33
回答 2查看 9.5K关注 0票数 6

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

  • Spring MVC UTF-8 Encoding这样的编码滤波器
  • 在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 )

今天,我遇到了一个问题,就是路径解析不能很好地解码。

代码语言:javascript
复制
@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”对其进行解码:

代码语言:javascript
复制
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);
}

它的输出"æ°æµª"是相同的。因此,路径变量实际上是用ISO8859-1解码的。

然后我尝试在我的web.xml中添加一个过滤器来解决这个问题:

代码语言:javascript
复制
  <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

代码语言:javascript
复制
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"
           URIEncoding="UTF-8" useBodyEncodingForURI="true"   ----Here is Added
/>

它对此有效,即使我移除过滤器。

但对于编码问题,我仍然非常困惑。此外,这只是GET方法,如果是POST方法,我想解决方案可能会有所不同。

有谁能解释一下,对于什么样的问题,我们应该采取什么不同的编码解决方案?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-11-15 10:55:37

  • CharacterEncodingFilter配置请求体的编码。也就是说,它影响POST请求参数的编码等,但不影响GET参数的编码。
  • URIEncoding用于指定URI的编码,因此它影响GET参数。
  • useBodyEncodingForURI="true"告诉Tomcat在解码URI时使用为请求体配置的编码。因此,据我所知,如果您设置了CharacterEncodingFilteruseBodyEncodingForURI="true",那么就不需要URIEncoding

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

  • CharacterEncodingFilter用于POST请求
  • URIEncoding (或useBodyEncodingForURI="true")用于GET请求
票数 3
EN

Stack Overflow用户

发布于 2020-01-05 02:55:58

对于tomcat7

  • CharacterEncodingFilter配置请求体的编码。也就是说,它影响POST请求参数的编码等,但不影响GET参数的编码。
  • useBodyEncodingForURI="true"告诉tomcat使用CharacterEncoding(可以由CharacterEncodingFilter设置)来解析QueryString。它会影响GET请求参数。
  • URIEncoding到parset URI,默认值为ISO8859-1.

对于tomcat8

  • 默认UTF-8。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26944802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档