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で試しました。
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攻撃 =。
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で正常に動作します