0

ここに私の問題があります。誰か助けてください....!

現在、アプリケーションをストラットから JSF2 に移行しています。登録が成功した後、確認のために電子メールに送信されたユーザー検証リンクがあります。例えば:

http://testserv:5050/bjb/page/validateAccount.faces?Email=qwerty@testsession#1.com&Code=1272

ユーザーに送信された古いリンクには、電子メール アドレスに特殊文字が含まれています。新しいアプリケーションでは、URLEncoder.encode を使用してそれらをエンコードしています。これはUTF-8とは関係ないと思いますが、リクエスト、レスポンス、JSFのExternalContext#setResponseCharacterEncodingをUTF-8に設定しています。tomcat も UTF-8 用に構成されています。

validateAccount.xhtml

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
</h:head>
<h:body>
<h:form acceptcharset="UTF-8" name="verifyUserAccountForm" id="verifyUserAccountForm" prependId="false">
        <f:metadata>
            <f:event type="preRenderView" listener="#{verifyUserBean.execute}"></f:event>
        </f:metadata>
    </h:form>
</h:body>
</html>

Java コードでは、FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(paramName); URL GET リクエスト パラメータを正しく読み取れませんでした。

既存のリンクでこれを解決するにはどうすればよいですか。xhtmlページにjavascript関数を記述でき、ロード時に実行できるので、javascript関数を使用してパラメーターをエンコードできます。しかし、<f:event type="preRenderView">呼び出しの前にその JavaScript 関数を実行する方法。

より良い解決策はありますか?

4

1 に答える 1

0

発信 URL のクエリ文字列パラメーターは、次のようにエンコードする必要があります。ここでは、目的の文字セットが明示的に言及されています。

String emailParam = URLEncoder.encode(email, "UTF-8");
String url = "http://testserv:5050/bjb/page/validateAccount.faces?Email=" + emailParam + "&Code=1272";

Tomcat サーバーは、まったく同じ文字セットを使用して着信 URL をデコードするように設定する必要があります。

<Context ... URIEncoding="UTF-8">

GET URL のエンコード/デコードに関して行う必要があるのはこれだけです。HTML メタ タグはこれに関係ありません。HTTP 応答エンコーディングは、これには関係ありません。charset を受け入れる HTML フォームは、良いことよりも悪いことをします。

<Context>正しい Tomcat 構成ファイルの要素を編集することに注意してください。たとえば、Eclipse で Tomcat を管理している場合、デフォルトでは、Tomcat のインストール フォルダではなく、Eclipse のServersプロジェクトで編集する必要があります。

こちらもご覧ください

于 2012-11-08T02:28:43.790 に答える