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

Gui*_*ume 21 java jsp tomcat servlets character-encoding

我的Java webapp中存在问题.

这是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>
Run Code Online (Sandbox Code Playgroud)

当我发送请求时,我的浏览器发送此标头:

GET /kjd/index.jsp?q=%C3%A9 HTTP/1.1\r\n
...
Accept-Charset: UTF-8,*\r\n
Run Code Online (Sandbox Code Playgroud)

Tomcat服务器将此返回给我:

Content-Type: text/html;charset=UTF-8\r\n
Run Code Online (Sandbox Code Playgroud)

但是如果我在表单中发送"é"(在UTF-8中为%C3%A9),则会显示"é".

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

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

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

request.setCharacterEncoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:8080/kjd/index.jsp?q=%E9
Run Code Online (Sandbox Code Playgroud)

"%E9"用ISO-8859-1表示,显示"é".

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

我在Tomcat 6和7以及Windows和Ubuntu上尝试过它.

Bal*_*usC 56

request.setCharacterEncoding("UTF-8");只设定请求的编码(其被用于通过POST请求),请求的未编码的URI(其被用于由GET请求).

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

<Connector ... URIEncoding="UTF-8">
Run Code Online (Sandbox Code Playgroud)

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

<Connector ... useBodyEncodingForURI="true">
Run Code Online (Sandbox Code Playgroud)

也可以看看:


请删除JSP中的那些scriptlet.在 request.setCharacterEncoding("UTF-8");被称为在错误的时刻.只要你正确使用Servlet处理请求,就太晚了.你更愿意为此使用过滤器.该 response.setCharacterEncoding("UTF-8");部分已经pageEncoding="UTF-8"在JSP的顶部隐式完成.

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


Div*_*iya 7

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

 <!-- 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>
Run Code Online (Sandbox Code Playgroud)

而已.在tomcat工作得很好