我遇到了1个问题但无法解决。我正在收到一个POST请求,并从RequestMapping获取一个变量,但是编码是错误的。
请求网址: 127.0.0.1:8080/projeto/ws/cidade/Uberl%C3%A2ndia
控制器:
@RequestMapping (value = "/city/{name}", method=RequestMethod.POST, produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> doGetPath(@PathVariable("name") String name) {
}
@PathVariable(“name”)上返回的值:Uberlândia
正确回归:Uberlândia
任何人都可以帮助我吗?
答案 0 :(得分:3)
这是由于运行控制器的JVM使用的字符编码与用于编码请求的编码不同。
要查看此内容,请使用已编码的网址127.0.0.1:8080/projeto/ws/cidade/Uberl%C3%A2ndia
并使用UTF-8传递http://www.url-encode-decode.com/
,结果为Uberlândia
。
但如果使用ISO-2022-CN进行解码,则结果为Uberlândia
。
要解决此问题,需要以与编码相同的方式对字符串进行解码。
要以全局方式更改服务器使用的编码,可以将JVM使用的编码设置为UTF-8,请参阅此answer。 CharacterEncodingFilter将确保使用给定的编码解码HTTP请求的内容。
另一种方法是让客户端发送请求以服务器期望的方式对其进行编码。
但是为了避免这些问题,您可能希望系统中的每个组件都配置为使用UTF-8。
答案 1 :(得分:0)
我的解决方案是: 创建课程
public class UrlPathHelperFixed extends UrlPathHelper {
public UrlPathHelperFixed() {
super.setUrlDecode(false);
}
@Override
public void setUrlDecode(boolean urlDecode) {
if (urlDecode) {
throw new IllegalArgumentException("Handler does not support URL decoding.");
}
}
@Override
public String getServletPath(HttpServletRequest request) {
String servletPath = getOriginatingServletPath(request);
return servletPath;
}
@Override
public String getOriginatingServletPath(HttpServletRequest request) {
String servletPath = request.getRequestURI().substring(request.getContextPath().length());
return servletPath;
}
}
将spring-mvc.xml更改为:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="order" value="-1"></property>
<property name="urlPathHelper">
<bean class="br.com.delivery.utils.UrlPathHelperFixed"/>
</property>
</bean>
并将maven-compilter配置为:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
...
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
和
UriUtils.decode(nome, "UTF-8")