如何在Tomcat中设置请求编码?

2022-09-01 21:42:21

我的 Java Web 应用程序有问题。

下面是 index.jsp 中的代码:

<%@page contentType="text/html" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<% request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
%>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Hello World!</h1>

        <form action="index.jsp" method="get">
            <input type="text" name="q"/>
        </form>

        Res: <%= request.getParameter("q") %>
    </body>
</html>

当我连接请求时,我的浏览器会发送以下标头:

GET /kjd/index.jsp?q=%C3%A9 HTTP/1.1\r\n
...
Accept-Charset: UTF-8,*\r\n

Tomcat 服务器向我返回了以下内容:

Content-Type: text/html;charset=UTF-8\r\n

但是,如果我以形式发送“é”(UTF-8 中的 %C3%A9),则会显示“é”。

我的理解是浏览器发送了一个用UTF-8编码的“é”(%C3%A9)。

但是服务器将其解释为ISO-8859-1。因此,%C3 被解码为 Ã,%A9 解码为 © ,然后发回以 UTF-8 编码的响应。

在代码中,应使用 UTF-8 对请求进行解码:

request.setCharacterEncoding("UTF-8");

但是,如果我发送此网址:

http://localhost:8080/kjd/index.jsp?q=%E9

“%E9”与 ISO-8859-1 解除关系,并显示“é”。

为什么这不起作用?为什么请求使用 ISO-8859-1 进行解码?

我已经在Tomcat 6和7以及Windows和Ubuntu上尝试过它。


答案 1

唯一设置请求正文的编码(由 POST 请求使用),而不是请求 URI 的编码(由 GET 请求使用)。request.setCharacterEncoding("UTF-8");

您需要在 Tomcat 的元素中设置属性,以使 Tomcat 将请求 URI(和查询字符串)解析为 UTF-8。这确实默认为ISO-8859-1。另请参阅 Tomcat HTTP 连接器文档URIEncodingUTF-8<Connector>/conf/server.xml

<Connector ... URIEncoding="UTF-8">

或者确保使用与正文 1 相同的编码来解析URI

<Connector ... useBodyEncodingForURI="true">

另请参阅:


1 来自Tomcat的文档(强调我的):

此设置是为了与 Tomcat 4.1.x 兼容,其中 contentType 中指定的编码或使用 Request.setCharacter 加密方法显式设置的编码也用于 URL 中的参数。默认值为 false。


请删除 JSP 中的这些脚本。在错误的时刻调用 。只要您正确使用 Servlet 来处理请求,就为时已晚。您更愿意为此使用过滤器。该部分已经在 JSP 之上隐式完成。request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");pageEncoding="UTF-8"

我还强烈建议EL替换老式的脚本,或者用JSTL XML转义来防止XSS攻击<%= request.getParameter("q") %>${param.q}${fn:escapeXml(param.q)}


答案 2

您只需要在conf / web.xml(Tomcat服务器)中取消注释部分代码,这些代码过滤所有请求并转换为UTF-8。web.xml

 <!-- A filter that sets character encoding that is used to decode -->
 <!-- parameters in a POST request -->
 <filter>
        <filter-name>setCharacterEncodingFilter</filter-name>
        <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
 </filter>

  <!-- The mapping for the Set Character Encoding Filter -->
  <filter-mapping>
        <filter-name>setCharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
  </filter-mapping>

就是这样。在雄猫中工作正常