web-dev-qa-db-ja.com

request.getParameter()がJavaサーブレットで文字エンコードを正しく表示しない

JavaサーブレットファイルのUTF-8に問題があります。URLでパラメータ値を取得すると、UTF-8文字に問題があります。日本語の文字が正しく表示されません。

Jspヘッダーにはすでに

_<%@ page language="Java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
_

コネクターのURIEncoding設定をserver.xmlのUTF-8に追加しました。

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

私はjspで次のようにコードを書きました。

_<s:textfield key="txt_name" name="txt_name" id="txt_name"
maxlength="64"></s:textfield>

<a href="javascript:showModalWindow('PopUpFile!init.action?<%=Common.PASSWORD%>=<%=Common.encript(ID, Code)%>','',940,650);">
<s:property value="PopUp Link" />
</a>

<script>
    function showModalWindow(x_URL, x_ARG, x_WIDTH, x_HEIGHT) {
        var x_OPT = "dialogHeight: " + x_HEIGHT + "px; " + "dialogWidth: "
                + x_WIDTH + "px; "
                + "Edge: Raised; center: Yes; resizable: Yes; status: Yes;";
        x_URL += "&name="+document.getElementById("txt_name").value;
        var retValue = window.showModalDialog(x_URL, x_ARG, x_OPT);
        if (retValue != null) {
            document.forms.frm.action = "ParentFile!getUser.action";
            document.forms.frm.submit();
        }
    }
</script>
_

そして、Javaサーブレットで次のようにコードを書きました。

_if(g_request.getParameter("name") != null){
    g_session.setAttribute(NAME, g_request.getParameter("name"));
}
_

また、Javaサーブレットでrequest.setCharacterEncoding()メソッドを使用してテストしましたが、実際には機能しません。サーブレットでの文字エンコードに関連する他の人の問題の回答から多くの方法を試しましたがstackoverflowでは、まで問題を解決できません。

文字エンコードを正しく表示するにはどうすればよいですか?前もって感謝します。

7
Sandar Min Aye

Apache Tomcatサーバーを含むほとんどのサーバーは、デフォルトで_ISO-8859-1_を使用したパラメーターエンコーディングに構成されています。プライベート専用サーバーインスタンスがない限り、これを変更することはないと思います。したがって、プログラマーの手法は、これらのパラメーターを手動でエンコード/デコードすることです。 javascriptを使用しているため、encodeURI()またはencodeURIComponent()組み込み関数があります。 JavaScriptでURLをエンコードする方法 を参照してください。コードを変更する必要があります

_x_URL += "&name="+encodeURI(document.getElementById("txt_name").value);
_

Javaでは、URLDecoderを使用してパラメータをデコードし直します。

_Java.net.URLDecoder.decode(((String[])request.getParameterMap().get("name"))[0], "UTF-8"));
_

Struts2 dispatcher結果タイプを使用している場合は、クエリ文字列のパラメータをデコードする必要がないことに注意してください。これらのパラメーターは、UrlHelperを介して解析されます。

ただし、これらのパラメーターをいつデコードするかは、Struts2で自動的にデコードされることを覚えていません。

原則として、URLでパラメーターを渡す場合は、URLエンコードする必要があることを知っておく必要があります。フォームは_x-www-form-urlencoded_であるため、フォームを送信する必要はありません。 17.13.4フォームのコンテンツタイプ を参照してください。

12
Roman C

_System.out.println_を使用して出力をテストしていますか?その場合は、UTF-8用に構成されていない可能性があります。

これを参照してください: JSPからサーブレットに特殊文字(UTF-8)を送信できません:疑問符が表示されます

また、パラメータを読み取る前に、必ずrequest.setCharacterEncoding("UTF-8")を実行してください。

8
stepanian

同様のエラーがあり、Springを使用している場合はサーブレットフィルターを使用して解決します。この定義をweb.xmlに追加するだけです。

<!-- CharacterEncodingFilter / UTF-8 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>

        <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

springを使用していない場合は、次のようなサーブレットフィルタを記述します。

protected void doFilterInternal(HttpServletRequest request,
            HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        //Set character encoding as UTF-8
        request.setCharacterEncoding("UTF-8");
        filterChain.doFilter(request, response);
    }
3
erhun

コメントを f.khantsis から回答にエスカレートしたいと思います。私の場合、それが重要であることが判明したからです。

重要:このフィルターが他のフィルターよりも先に最初に実行されることを確認してください。そうしないと、機能しません。

サーブレットフィルタに正しいエンコーディング設定がありました。

    request.setCharacterEncoding("UTF-8");

しかし、request.getParameterにブレークポイントを設定すると、エンコードを設定する前にパラメーターを読み取っていることがわかりました。別のフィルター(csrf)で発生していました。この時点で、エンコーディングはフリーズし、さらに設定しても効果がありませんでした。これはサーバーに依存する可能性がありますが、私たちの場合(Websphere)はそうでした。

0
Jarekczek