一尘不染

无法获取Servlet以UTF-8格式处理请求内容

tomcat

我正在将旧版应用程序从ISO-8859-1转换为UTF-8,并且已经使用了许多资源来确定需要设置哪些才能使其正常工作。但是,在进行了几次配置,代码和环境更改之后,我的Servlet(在Tomcat
5中)似乎没有将提交的HTML表单内容处理为UTF-8。

这是我为配置设置的内容。

  • 系统属性
[user@server ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
  • tomcat5 server.xml
<Connector protocol="HTTP/1.1"
    ...
    URIEncoding="UTF-8"
    useBodyEncodingForURI="true"/>
  • JSP文件
>     <%@ page language="java" pageEncoding="UTF-8"
> contentType="text/html;charset=UTF-8" %>
>     ...
>     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  • Servlet过滤器
>     public void doFilter(ServletRequest request, ServletResponse response,
> FilterChain chain)
>     {
>         if(request.getCharacterEncoding() == null)
>         {
>             request.setCharacterEncoding("UTF-8");
>         }
>         ...

通过一些调试日志,我了解以下内容:

>     System.getProperty("file.encoding"): "UTF-8"
>     java.nio.charset.Charset.defaultCharset(): "UTF-8"
>     new OutputStreamWriter(new ByteArrayOutputStream()).getEncoding():
> "UTF8"

但是,当我使用包含“Битьбаклуши”的输入提交表单时,会看到以下内容(从我的日志中):

>     request.getParameter("myParameter") = Ð\221иÑ\202Ñ\214
> баклÑ\203Ñ\210Ð

我知道请求内容类型为null,因此在我的servlet过滤器中将其明确设置为“
UTF-8”。另外,我正在从一个终端查看我的日志,该终端的编码我也知道也设置为UTF-8。

我在这里想念什么? 我还需要为Servlet设置什么才能将我的输入正确处理为UTF-8?
如果有更多信息会有所帮助,我将很乐意添加更多调试信息并以此来更新此问题。

编辑:

  • 我没有使用Windows Terminal(我正在使用PuTTY),所以我可以肯定的是问题不是我正在查看的日志。其次,当我将响应与提交的内容一起发送回浏览器并输出时,它与上面的垃圾相同。
  • 该表格是从IE8提交的。

解:

web.xml对CharsetFilter的定义太低了(低于我的servlet配置和其他过滤器)。我将过滤器定义移到了web.xml文档的最顶部,一切正常。请参阅下面接受的答案。


阅读 295

收藏
2020-06-16

共1个答案

一尘不染

Edit4 (要求的最终答案和更正的答案)

您的servlet过滤器应用得太晚了。

可能的适当顺序web.xml如下

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">

<web-app>
    <!--CharsetFilter start--> 
    <filter>
        <filter-name>Charset Filter</filter-name>
        <filter-class>CharsetFilter</filter-class>
        <init-param>
            <param-name>requestEncoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <!-- The rest is ommited -->
2020-06-16