【问题标题】:Servlets - Can we set Character Encoding after fetching parameters [duplicate]Servlets - 我们可以在获取参数后设置字符编码吗?
【发布时间】:2018-10-06 17:30:39
【问题描述】:

我有一个过滤器,我在获取参数后设置 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。我不清楚事情是如何运作的。

【问题讨论】:

  • @BalusC 我问的问题是 setCharacterEncoding 在获取参数后不起作用的原因

标签: java servlets jakarta-ee servlet-filters


【解决方案1】:

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

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

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

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

【讨论】:

  • 我正在使用 JBoss
  • JBoss web 容器是Tomcat(嵌入了tomcat)
  • 感谢@Sebastien,但文档说“必须在 getWriter 之前调用 setContentType 或 setLocale 方法,以使字符集影响编写器的构造。”。但是,在我的示例中,我在过滤器上使用它并检查参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2019-12-14
  • 1970-01-01
  • 2018-10-18
相关资源
最近更新 更多