Spring 3.2 MVC @RequestParam意外解码

时间:2014-11-27 13:49:32

标签: spring-mvc character-encoding url-encoding

请考虑以下查询字符串

siteId=360798&listingId=695332&stockFilename=6065/1mb%20&%20(Custom).jpg&uploadToken=2640861a8f06799416bae9d0a58839dd&username=Chuck%20Norris

我的MVC控制器上有以下内容

@RequestParam("stockFilename") String stockFilename

我期望在我的参数中获得" 6065 / 1mb& (自定义).jpg" ,但结果是" 6065 / 1mb" 。我的第一个猜测是这是一个编码问题,所以我去了web.xml并查看了我的编码过滤器,但这似乎是按顺序

<filter>
    <filter-name>CharacterEncodingFilter</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>

接下来我去查看我的服务器设置

Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"

我已经添加了URIEncoding属性,因为我发现一篇文章将此解释为可能的罪魁祸首。但它根本没有解决我的问题。我现在实际上是出于想法,我仍然非常确定它必须是一个编码问题,并且Spring正在错误地解码它。我会继续搜索,但我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

在servlet-context中添加此方法和bean:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

public final class DoNotTruncateMyUrls implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof RequestMappingHandlerMapping) {
            ((RequestMappingHandlerMapping)bean).setUseSuffixPatternMatch(false);
        }
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

Bean:

<beans:bean class="com.packagename.DoNotTruncateMyUrls" />

让我知道这是否有效,或者我有其他解决方案。