web-dev-qa-db-ja.com

request.getQueryString()にはエンコードが必要なようです

UTF-8に問題があります。クライアント(GWTで実現)は、次のように、URLにいくつかのパラメーターを指定して、サーブレットに要求を行います。

http://localhost:8080/servlet?param=value

サーブレットでURLを取得すると、UTF-8文字に問題があります。私はこのコードを使用します:

protected void service(HttpServletRequest request, HttpServletResponse response) 
                    throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");

        String reqUrl = request.getRequestURL().toString(); 
        String queryString = request.getQueryString();
        System.out.println("Request: "+reqUrl + "?" + queryString);
        ...

したがって、このURLを呼び出すと:

http://localhost:8080/servlet?param=così

結果は次のようになります。

Request: http://localhost:8080/servlet?param=cos%C3%AC

文字エンコードを適切に設定するにはどうすればよいですか?

29
Gabriele

私は以前にこの同じ問題に遭遇しました。使用しているJavaサーブレットコンテナ)が不明ですが、少なくともTomcat 5.x(6.xについては不明)では、request.setCharacterEncoding()メソッドには実際にはありませんGETパラメーターへの影響:サーブレットの実行時までに、GETパラメーターはTomcatによってすでにデコードされているため、setCharacterEncodingは何もしません。

これを回避する2つの方法:

  1. コネクターのURIEncoding設定をUTF-8に変更します。 http://Tomcat.Apache.org/Tomcat-5.5-doc/config/http.html を参照してください。

  2. BalusCが提案するように、クエリ文字列を自分でデコードし、(ServletRequest APIを使用するのではなく)手動でパラメータマップに解析します。

お役に立てれば!

27
schematic

HttpServletRequest#getQueryString()javadoc から:

Returns:クエリ文字列を含む文字列、またはURLにクエリ文字列が含まれていない場合はnull。 値はコンテナによってデコードされません。

最後のステートメントに注意してください。したがって、 RL-decodeJava.net.URLDecoder を使用して自分で行う必要があります。

_String queryString = URLDecoder.decode(request.getQueryString(), "UTF-8");
_

ただし、パラメーターを収集する通常の方法は、単に HttpServletRequest#getParameter() を使用することです。

_String param = request.getParameter("param"); // così
_

正しいエンコーディングを使用するように設定した場合、servletcontainerはすでにURLデコードされています。 request.setCharacterEncoding()は、リクエストURI(GET)ではなく、リクエスト本文(POST)にのみ影響します。 Mirageの回答も参照してください。

29
BalusC

本当に一日かかったけど:

final String param = new String(request.getParameter("param").getBytes(
                "iso-8859-1"), "UTF-8");

here もご覧ください。これは有効であることに注意してくださいiffサーバーのデコード文字セット(TomcatのURIEncoding)はiso-8859-1-それ以外の場合、この文字セットTomcat 7のserver.xmlからURIEncoding文字セットを取得する方法の例については、引用符で囲んだ answer を参照してください。

20
Mr_and_Mrs_D

POST requestの場合、次の方法で問題を解決しました。

  1. Connectorのserver.xmlでURIEncoding = "UTF-8" attrを設定します。 (Tomcat 8を使用しています)
  2. パラメーターを取得する前にrequest.setCharacterEncoding( "UTF-8")を設定します。

最後に、正しいutf-8キャラクターのデリリーを取得しました。文字列名= request.getParameter( "name");

名前に正しいutf-8文字列が含まれています。

HTTPリクエストパラメータのエンコーディングに影響する多くの要因があります。この問題のシーケンスガイドを参照できます。

1.フォームの受け入れ文字エンコードを確認します。

<form id="edit-box" name="edit-box-name" method="post" accept-charset="UTF-8">

2. httpサーバーのデフォルトの文字エンコード値を確認します。 Apache httpサーバーの場合、"AddDefaultCharset UTF-8"文字列をhttpd.confファイルに。

3.バックエンドサーバーがある場合は、バックエンドサーバーの文字エンコード値を確認します。 Tomcatバックエンドサーバーの場合、「URIEncoding = "UTF-8"属性をコネクタに追加します。たとえば、

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"  redirectPort="8443" URIEncoding="UTF-8"/>

...

httpリクエストパラメータエンコーディング問題のガイド

1
nominor