@PathVariable编码问题 - Spring MVC

时间:2014-02-15 22:05:50

标签: java spring java-ee spring-mvc

我遇到了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

任何人都可以帮助我吗?

2 个答案:

答案 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")