【问题标题】:Get Parameter Encoding获取参数编码
【发布时间】:2011-07-23 16:35:57
【问题描述】:

我在 GET 请求中使用 spring mvc 和特殊字符时遇到问题。考虑以下方法:

@RequestMapping("/update")
public Object testMethod(@RequestParam String name) throws IOException {
    }

例如,我向其发送名称包含“ä”(德语变音符号)的 GET 请求。由于浏览器将“ä”映射到%C3%A4,它会导致spring 收到“ä”。

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

感谢您的帮助!

【问题讨论】:

  • URL 是如何编码的?这里只有一种标准编码:utf-8, %-encoded as needed.
  • 请求URL编码为...%C3%A4
  • 你想在控制器中返回一个 utf8。如果是,你必须重新编码 url。

标签: spring spring-mvc jakarta-ee


【解决方案1】:

这个呢?有帮助吗?

在您的 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;
    }

}

【讨论】:

  • 我已经尝试过 spring 附带的过滤器 org.springframework.web.filter.CharacterEncodingFilter 并按照您的描述进行操作。很遗憾没有结果。
  • 很奇怪.. 不知道还有什么可能。
  • 可能来自浏览器的数据不是utf-8,因为表单页面不是utf-8
  • 对于后来的读者:我试过这个,但它只适用于 POST 而不是 GET。
【解决方案2】:

您遇到了这个问题,因为请求区分了正文编码和 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:run

【讨论】:

  • 我直接使用Tomcat,没有连接器。你描述的解决方案还能用吗?
  • 我现在不需要在连接器标签上也需要它。之前只是在上下文标签上。非常感谢!
  • 为什么它们没有默认为 UTF-8?
  • 对于所有使用webapp-runner的人,这可以通过添加--uri-encoding UTF-8参数来实现
  • 在 server.xml 文件中设置
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 2017-07-22
  • 2020-01-02
  • 2023-04-05
  • 2010-10-08
  • 2016-09-14
  • 2021-01-15
  • 2019-08-03
相关资源
最近更新 更多