Как установить кодировку запроса в Tomcat? - PullRequest
21 голосов
/ 29 июля 2011

У меня проблема в моем веб-приложении на Java.

Вот код в 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.

Ответы [ 2 ]

56 голосов
/ 29 июля 2011

request.setCharacterEncoding("UTF-8"); устанавливает только кодировку запроса body (которая используется запросами POST), а не кодировку запроса URI (которая используетсяGET запросы).

Вам нужно установить атрибут URIEncoding в UTF-8 в элементе <Connector> элемента /conf/server.xml Tomcat, чтобы 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 , где кодировка, указанная в contentType или явно заданная с использованием метода Request.setCharacterEncoding, также использовалась для параметров из URL-адреса.Значение по умолчанию - false.


Пожалуйста, избавьтесь от этих скриптлетов в вашем JSP.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-атак .

7 голосов
/ 15 июня 2016

вам просто нужно раскомментировать нижнюю часть кода в файле 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...