Как установить кодировку запроса в Tomcat?
У меня проблема в моем 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");
Но, если я отправлю этот URL-адрес:
http://localhost:8080/kjd/index.jsp?q=%E9
"% E9" декодируется с помощью ISO-8859-1 и отображается "é" .
Почему это не работает? Почему запросы декодируются с помощью ISO-8859-1?
Я пробовал его на Tomcat 6 и 7, а также на Windows и Ubuntu.
Ответы
Ответ 1
The request.setCharacterEncoding("UTF-8");
устанавливает только кодировку тела запроса (которая используется запросами POST), а не кодировку URI запроса (который используется запросами GET).
Вам нужно установить для атрибута URIEncoding
значение UTF-8
в элементе <Connector>
/conf/server.xml
Tomcat /conf/server.xml
чтобы Tomcat проанализировал URI запроса (и строку запроса) как UTF-8. Это действительно по умолчанию ISO-8859-1. См. Также документацию Tomcat HTTP Connector.
<Connector ... URIEncoding="UTF-8">
или чтобы убедиться, что URI анализируется с использованием той же кодировки, что и тело 1:
<Connector ... useBodyEncodingForURI="true">
Смотрите также:
1 Из документации Tomcat (выделено мое):
Этот параметр присутствует для совместимости с Tomcat 4.1.x, где для параметров из URL-адреса также использовалась кодировка, указанная в contentType или явно заданная с использованием метода Request.setCharacterEncoding. Значение по умолчанию неверно.
Пожалуйста, избавьтесь от этих скриптлетов в вашем JSP. The request.setCharacterEncoding("UTF-8");
вызывается не в тот момент. Было бы слишком поздно, если бы вы правильно использовали сервлет для обработки запроса. Вы бы предпочли использовать фильтр для этого. response.setCharacterEncoding("UTF-8");
часть уже неявно сделана с помощью pageEncoding="UTF-8"
в верхней части JSP.
Я также настоятельно рекомендую заменить старомодный скриптлет <%= request.getParameter("q") %>
на EL ${param.q}
или JSTL XML, ${fn:escapeXml(param.q)}
чтобы предотвратить XSS атаки.
Ответ 2
вам просто нужно раскомментировать часть кода в conf/web.xml(Tomcat server 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