2012-06-12 15 views
10

私はRichFaces 4オートコンプリートコンポーネントと次のJSF 2ページとJava Beanを使用して実装されたJSFの検索フォームを用意しています。 Tomcat 6 & 7を使ってアプリケーションを実行します。 AutoCompleteBeanJSFでのGETパラメータのUTF-8エンコード

public String doSearch() { 

    //some logic here 
    return "/path/to/page/with/multiple_results?query=" + searchQuery + "&faces-redirect=true"; 

} 

... 
<h:commandButton value="#{msg.search}" styleClass="search-btn" action="#{autoCompletBean.doSearch}" /> 
... 

これは「SEARCHQUERY」文字列をwithingすべてがラテン1にあるようラテン-1の外にある場合、それは動作しない限り有効です。

たとえば、「bodø」の検索は自動的に「bod%F8」とエンコードされます。ただし、 "Ð"をエンコードすることができないため、 "KraÐong"の検索は機能しません。

私は今、これを解決するためにいくつかの異なるアプローチを試みましたが、いずれも機能しません。

  • 私はURLEncodeを使用して自分のsearchQueryをエンコードしようとしましたが、これは%が%25としてエンコードされているため、二重エンコードになります。
  • java.net.URIを使用してエンコードを取得しようとしましたが、URLEncodeと同じ結果が得られます。
  • URIEncoding = "UTF-8"を使用してTomcatでUTF-8を有効にしようとしましたが、これは非ASCII文字がまったく機能しないため、この問題を悪化させるだけです。

私の質問にそう:

  1. 私はJSF 2は、GETパラメータを符号化する方法を変更することはできますか?
  2. JSF 2でGETパラメータをエンコードする方法を変更できない場合、エンコードを変更して手動で行うことはできますか?
  3. 私はここで何か変なことをしていますか?これは、すぐにサポートされるべきもののようですが、私は同じ問題を持つ他のものを見つけることができません。

答えて

9

私はあなたがJSFのコーナーケースバグに当たったと思います。クエリ文字列はExternalContext#encodeRedirectURL()によってURLエンコードされ、ExternalContext#getResponseCharacterEncoding()で取得されたレスポンス文字エンコードが使用されます。ただし、JSFはデフォルトでレスポンス文字エンコーディングとしてUTF-8を使用しますが、レスポンスをリダイレクトするときではなく、実際にビューをレンダリングする場合にのみ設定されているため、レスポンス文字エンコーディングではプラットフォームのデフォルト値はISO-8859-1この誤ったエンコーディングを使用して文字がURLエンコードされる原因になります。

これはissue 2440と報告しました。一方、あなたの最善の策は、あなた自身があらかじめ応答文字を明示的に設定することです。

FacesContext.getCurrentInstance().getExternalContext().setResponseCharacterEncoding("UTF-8"); 

これはまだコンテナ自体がリクエストURLを復号化するために、同じ文字エンコーディングを使用することが必要ですので、あなたは確かにTomcatの設定でURIEncoding="UTF-8"を設定する必要があることに注意してください。これで、実際にUTF-8になるので、これ以上文字を混乱させることはありません。

+0

はい、これは機能します。ありがとう! – oyse

+0

あなたは大歓迎です:) – BalusC

0

HTTP URLとヘッダーで使用できる唯一の文字エンコーディングはUS-ASCIIです。これらの文字をURLエンコードしてアプリケーションに戻す必要があります。

public String doSearch() { 

    //some logic here 
    String encodedSearchQuery = java.net.URLEncoder.encode(searchQuery, "UTF-8"); 
    return "/path/to/page/with/multiple_results?query=" + encodedSearchQuery + "&amp;faces-redirect=true"; 

} 

そして、それはあなたが使用するすべての文字のために働く必要があります。javaでこれを行う最も簡単な方法は次のようになります。

+0

JSFはこれを暗黙のうちに行います。少なくとも、それはそうするはずです。もう一度質問を読んでください。例えば。 * "URLEncodeを使用してsearchQueryを自分自身でエンコードしようとしましたが、これは%が%25としてエンコードされているため、二重エンコードになります。" * – BalusC

関連する問題