gpt4 book ai didi

java - Tomcat的 "URIEncoding"、Encoding Filter和request.setCharacterEncoding有什么区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:19 25 4
gpt4 key购买 nike

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

今天,我有一个问题,路径参数没有像

这样解码好
@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+"------------");
}

我可以看到 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>
<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

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"
URIEncoding="UTF-8" useBodyEncodingForURI="true" ----Here is Added
/>

即使我移除过滤器,它也适用于此。

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

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

谢谢!

最佳答案

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

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

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

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

  • CharacterEncodingFilter 用于POST 请求

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

关于java - Tomcat的 "URIEncoding"、Encoding Filter和request.setCharacterEncoding有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26944802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com