Подтвердить что ты не робот

Как установить кодировку запроса в 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.

4b9b3361

Ответ 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