2011-03-26 54 views
9

我在GET请求中使用spring mvc和特殊字符时出现问题。考虑以下方法:例如,我向其发送名称包含“ä”(德语变音符号)的GET请求,并向其发送GET请求。由于浏览器将“ä”映射到%C3%A4,导致春天收到“Ô。获取参数编码

那么,我怎样才能得到正确的编码字符串我的控制器?

感谢您的帮助!

+1

是如何URL编码?这里只有一种标准编码:utf-8,根据需要编码%。 – bmargulies 2011-03-26 23:13:08

+0

请求的URL编码为'...%C3%A4' – Erik 2011-03-28 14:57:16

回答

7

这是怎么回事?它可以帮助吗?

在你的web.xml

<filter> 
     <filter-name>CharacterEncodingFilter</filter-name> 
     <filter-class>com.example.CharacterEncodingFilter</filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>CharacterEncodingFilter</filter-name> 
     <servlet-name>dispatcher</servlet-name> 
    </filter-mapping> 

com.example.CharacterEncodingFilter

public class CharacterEncodingFilter implements Filter { 

    protected String encoding; 

    public void init(FilterConfig filterConfig) throws ServletException { 
     encoding = filterConfig.getInitParameter("encoding"); 
    } 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
      FilterChain filterChain) throws IOException, ServletException { 

     HttpServletRequest request = (HttpServletRequest) servletRequest; 
     request.setCharacterEncoding(encoding); 

     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    public void destroy() { 
     encoding = null; 
    } 

} 
+2

我已经试过过滤器org.springframework.web.filter.CharacterEncodingFilter,它随Spring一起提供,并执行您的描述。不幸的是没有结果。 – Erik 2011-03-27 11:11:51

+0

非常奇怪..不知道它可能是什么。 – Rihards 2011-03-27 12:49:14

+1

也许来自浏览器*的数据不是utf-8 *,因为表单页面*不是utf-8 *。 – bmargulies 2011-03-28 15:01:08

41

您遇到这个问题,因为请求体编码和URI区分编码。 CharacterEncodingFilter设置正文编码,但不设置URI编码。

您需要设置URIEncoding =“UTF-8”作为Tomcat server.xml中所有连接器的属性。看到这里:http://tomcat.apache.org/tomcat-6.0-doc/config/ajp.html

或者,或者,您可以设置useBodyEncodingForURI =“True”。

如果您正在使用Maven的Tomcat插件,只需要添加此参数:

MVN -Dmaven.tomcat.uriEncoding = UTF-8 tomcat的:运行

+1

我直接使用Tomcat而没有连接器。你所描述的解决方案是否仍然有效? – Erik 2011-04-04 08:22:43

+1

这个答案给我节省了很多时间,谢谢! – olan 2011-06-01 14:23:42

+0

这里很好。 – onigunn 2011-08-29 15:17:10