我使用spring MVC来获取@PathVariable的参数,如下所示:
@GetMapping("/users/{username}")
public Boolean getUser(@PathVariable("username") String username)
{
// do some works
}
当我的输入参数不是英语(例如阿拉伯语)时,我无法获得正确的参数值和用户名参数包含无效的ASCII码。另外,我确信客户端以UTF-8格式发送请求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>
我使用@RequestsParam和HttpServletRequest测试我的代码,但是它们都返回了无效字符,我也使用了URLEncoder.encode和URLDecoder.decode,但可以解决问题。
答案 0 :(得分:1)
我通过使用此代码使用ISO_8859_1字符集来解决我的问题:
username = new String(username.getBytes(CharSets.ISO_8859_1));
但是,我真的不知道是什么原因?我希望使用UTF-8编码来获取正确的参数值,但它不起作用。
答案 1 :(得分:0)
当请求使用GET方法时,encodingFilter无效。您应该配置应用服务器的URIEncoding.eg:Modify Tomcat的server.xml,添加URIEncoding。
<Connector URIEncoding="UTF-8" port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />