Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';这两者之间的区别是什么;“编码”;Tomcat的编码过滤器和请求。setCharacterEncoding_Java_Spring_Tomcat_Encoding_Utf 8 - Fatal编程技术网

Java 什么';这两者之间的区别是什么;“编码”;Tomcat的编码过滤器和请求。setCharacterEncoding

Java 什么';这两者之间的区别是什么;“编码”;Tomcat的编码过滤器和请求。setCharacterEncoding,java,spring,tomcat,encoding,utf-8,Java,Spring,Tomcat,Encoding,Utf 8,有很多方法可以解决编码问题: 类过滤器编码 在Tomcat的server.xml中设置URIEncoding=UTF-8,如 请求。setCharacterEncoding(utf-8) 今天,我遇到了一个问题,路径参数没有像 @ResponseBody @RequestMapping(value="/context/method/{key}",method=RequestMethod.GET,produces = "application/json;charset=utf-8") publ

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

  • 类过滤器编码

  • 在Tomcat的server.xml中设置URIEncoding=UTF-8,如

  • 请求。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+"------------");
}
我看到钥匙被破译坏了!如果我传递一个单词
”新浪"
从前端开始,它将变成
“æ°æ檔

它的输出是相同的
“æ°æµª”
。因此,确实,path变量是用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> 
即使我取下过滤器,它也能起作用

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

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

谢谢!

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

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

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

实际上,要解决参数编码可能出现的问题,您需要做两件事:

  • CharacterEncodingFilter
    用于
    POST
    请求

  • URIEncoding
    (或
    useBodyEncodingForURI=“true”
    )用于
    GET
    请求

适用于tomcat7

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

  • useBodyEncodingForURI=“true”告诉tomcat使用CharacterEncoding(可以通过CharacterEncodingFilter设置)来解析QueryString。它是影响GET请求参数

  • URIEncoding要解析URI,默认值为ISO-8859-1

对于tomcat8

  • 默认UTF-8

1.关于
request.setCharacterEncoding
2.我读过一本书,在
GET
方法中,pathvar和查询字符串(URL)是分开解码的。因此,我们需要,URIEncoding用于URI(path var),而
useBodyEncodingForURI
用于URL上的查询字符串。这本书错了吗?
  <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> 
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"
           URIEncoding="UTF-8" useBodyEncodingForURI="true"   ----Here is Added
/>