2011-09-15 19 views
9

バリデーターはフルリクエストかajaxリクエストかを知る必要があります。私の現在のソリューションでは、私はX-Requested-With要素のためのHTTPリクエストヘッダを確認してください。JSFカスタムバリデーターで完全なリクエストからajaxリクエストを区別する

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    HttpServletRequest req = (HttpServletRequest) context.getExternalContext().getRequest(); 
     if (req.getHeader("X-Requested-With") != null) { 
      // do something 
     } else { 
      // do something else 
     } 
     ... 
} 

は、これを達成するためのより良い方法はありますか?私のソリューションは、さまざまなブラウザ/ javascriptライブラリに関して "安全"ですか?

UPDATE:

だけAJAXリクエストがPrimefacesコンポーネントライブラリ(<p:ajax>タグ)から来る場合Xは、要求-WITHヘッダのみ存在することを見出しました。

プレーンなJSFを使用するとが存在しませんです。<f:ajax>です。 私のアプローチは<f:ajax>とは動作しません。 <f:ajax>を使用して

は異なるヘッダーがあります:

Faces-Request:partial/ajax 

OSWによって提案された解決策は<f:ajax><p:ajax>の作品:

PartialViewContext#isAjaxRequest()

答えて

14

私は、HTTPヘッダーに依存しないでしょう。決して自分でそれを試していないが、あなたは次のことを行うことができます:別のオプションではなく、あなたの答えのためのisAjaxRequest()

+0

あなたの答えをありがとう。いいですね。あなたはその方法が何をしているか知っていますか?たぶん、ヘッダだけをチェックすることもあります。 –

+0

@Matt、申し訳ありませんが、正確に何をしているのかわかりませんが、オプションはヘッダーをチェックしているか、リクエストパラメータマップをチェックしています。 – Osw

+0

私の質問が更新されました。私の解決策は安全ではないようです。 –

1
私はそれが信頼性の高い方法であることをいただきたい

それを確認する。これは、例えばDjangoはAJAXリクエストをチェックする方法を正確に示します。また、そのようなとしてここに記載されている

def is_ajax(self): 
     return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' 

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

+0

感謝のisPartialRequest()を使用している

PartialViewContext pvc = facesContext.getPartialViewContext(); if(pvc.isAjaxRequest()) { // ... } else { // ... } 

。私の質問が更新されました。私の解決策は安全ではないようです。 –

関連する問題