2011-09-15 23 views
9

我的驗證器需要知道它是完整請求還是ajax請求。在我目前的解決方案,我檢查HTTP請求頭爲X-Requested-With元素:在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:

只要發現該X-請求-隨着頭只存在如果AJAX請求來自Primefaces組件庫(在<p:ajax>標記)。

這是不是如果我使用普通JSF <f:ajax>存在。 所以我的方法將不會與<f:ajax>

使用<f:ajax>有不同的頁眉:

Faces-Request:partial/ajax 

通過OSW提出的解決方案適用於<f:ajax><p:ajax>

PartialViewContext#isAjaxRequest()

回答

14

我不會依賴於HTTP標頭。從來沒有嘗試過我自己,但你可以做到以下幾點:

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

另一種選擇是使用isPartialRequest()代替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

謝謝您的回答。更新了我的問題。看起來像我的解決方案不安全。 –