web-dev-qa-db-ja.com

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>

リクエストをWiresharkで送信すると、ブラウザは次のヘッダーを送信します。

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

しかし、フォームで「é」(UTF-8の%C3%A9)を送信すると、代わりに「é」が表示されます。

私が理解しているのは、ブラウザが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で試しました。

21
Guillaume

request.setCharacterEncoding("UTF-8");は、リクエストのエンコードのみを設定しますbody(POSTリクエスト)によって使用されます)、リクエストのエンコードではありません- [〜#〜] uri [〜#〜](GETリクエストで使用されます)。

Tomcatが要求URI(およびクエリ文字列)をUTF-8として解析するようにするには、Tomcatの_UTF-8_の_<Connector>_要素でURIEncoding属性を_/conf/server.xml_に設定する必要があります。実際、これはデフォルトでISO-8859-1になります。 Tomcat HTTP Connector Documentation も参照してください。

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

または、本体と同じエンコードを使用してURIが解析されるようにします1

_<Connector ... useBodyEncodingForURI="true">
_

こちらもご覧ください:


1 Tomcatのドキュメント (エンファシス鉱山)から:

この設定はTomcat 4.1.xとの互換性のためにであり、contentTypeで指定されたエンコード、またはRequest.setCharacterEncodingメソッドを使用して明示的に設定されたエンコードがURLのパラメーターにも使用されました。デフォルト値はfalseです。


JSPでこれらのscriptletsを削除してください。 request.setCharacterEncoding("UTF-8");は、間違ったタイミングで呼び出されます。サーブレットを適切に使用してリクエストを処理すると、手遅れになります。これには filter を使用したいです。 response.setCharacterEncoding("UTF-8");部分は、JSPの最上部の_pageEncoding="UTF-8"_によってすでに暗黙的に行われています。

また、 強く推奨 昔ながらの<%= request.getParameter("q") %>scriptlet[〜#〜] el [〜# 〜] _${param.q}_、または [〜#〜] jstl [〜#〜] XMLエスケープ${fn:escapeXml(param.q)}を防止して XSS攻撃 =。

56
BalusC

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で正常に動作します

7