Servlets - 我们可以在获取参数后设置字符编码

时间:2018-04-26 06:01:44

标签: java servlets java-ee servlet-filters

我有一个过滤器,我在获取未设置编码的参数后设置request.setCharacterEncoding(" UTF-8")。在流程方法中,我只是检查请求是否包含任何被删除的特殊字符。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    getParams(request);
    chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);
}

private void getParams(ServletRequest request)
{

    HttpServletRequest httpRequest = (HttpServletRequest) request;
    Map paramMap = httpRequest.getParameterMap();

    Set entrySet = paramMap.entrySet();

    for (Iterator iterator = entrySet.iterator(); iterator.hasNext();)
    {
        Map.Entry entry = (Map.Entry) iterator.next();  

        String s = process(entry.getValue().toString());
        //entry.setValue(s);

    }
}

在给定代码中,我在链中的下一个过滤器中设置了CharacterEncoding。

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    request.setCharacterEncoding("UTF-8");
    chain.doFilter(request, response);
}

但是,如果我在第一个过滤器中设置参数之前将其设置为正常工作。

因此有必要在获取参数之前设置CharacterEncoding。我不清楚事情是如何运作的。

1 个答案:

答案 0 :(得分:0)

默认情况下,如果未在HTTP请求中指定编码,则服务器会认为编码为ISO-8859-1(拉丁语1)。至少对于将Tomcat嵌入Web容器的Tomcat和JBoss来说就是这种情况。

如果在检索请求参数之前调用setCharacterEncoding方法,则会覆盖此默认行为,以使其按预期工作。

相反,如果在检索请求参数后调用setCharacterEncoding方法,则将使用默认的ISO-8859-1编码检索它们。接下来你覆盖它,但为时已晚。

有关在webapps中使用UTF-8编码的详细信息,请参阅此帖子:How to get UTF-8 working in Java webapps?