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

时间:2011-07-29 17:19:55

标签: 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>

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

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

但如果我在表格中发送“é”(%C3%A9,UTF-8),则显示“é”。

据我所知,浏览器会发送一个用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上尝试过它。

2 个答案:

答案 0 :(得分:55)

request.setCharacterEncoding("UTF-8");仅设置请求正文(已被POST请求使用)的编码,而不是请求 URI 的编码(其中被GET请求使用。)

您需要在Tomcat的URIEncoding的{​​{1}}元素中将UTF-8属性设置为<Connector>,以使Tomcat将请求URI(以及查询字符串)解析为UTF-8。这确实默认为ISO-8859-1。另请参阅Tomcat HTTP Connector Documentation

/conf/server.xml

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

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

另见:


请在JSP中删除那些 scriptlet 。在错误的时刻调用<Connector ... useBodyEncodingForURI="true"> 。只要您正确使用Servlet处理请求,就太晚了。你更愿意使用filter来做这件事。 request.setCharacterEncoding("UTF-8");部分已由response.setCharacterEncoding("UTF-8");在JSP顶部隐式完成。

我还strongly recommendEL pageEncoding="UTF-8"JSTL XML转义{替换旧式<%= request.getParameter("q") %> scriptlet {1}}以阻止XSS attacks

答案 1 :(得分:8)

你只需要在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>

就是这样。在tomcat工作正常