2011-09-15 27 views
9

Trình xác thực của tôi cần biết nếu đó là yêu cầu đầy đủ hoặc yêu cầu ajax. Trong giải pháp hiện tại của tôi, tôi kiểm tra tiêu đề yêu cầu http cho phần tử X-Requested-With:Phân biệt các yêu cầu ajax từ các yêu cầu đầy đủ trong trình xác thực tùy chỉnh JSF

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 
     } 
     ... 
} 

Có cách nào tốt hơn để đạt được điều này? Giải pháp của tôi là "an toàn" đối với các trình duyệt khác nhau/javascript libs?

UPDATE:

Chỉ cần phát hiện ra rằng X-yêu cầu-Với tiêu đề duy nhất là hiện nay nếu yêu cầu ajax đến từ các thư viện thành phần Primefaces (tag <p:ajax>).

Đó là không phải hiện tại nếu tôi sử dụng JSF đơn giản <f:ajax>. Vì vậy, cách tiếp cận của tôi sẽ không hoạt động với<f:ajax>.

Sử dụng <f:ajax> có một tiêu đề khác nhau:

Faces-Request:partial/ajax 

Giải pháp bởi OSW đề nghị làm việc cho <f:ajax><p:ajax>:

PartialViewContext#isAjaxRequest()

Trả lời

14

tôi sẽ không dựa vào tiêu đề http. Chưa bao giờ thử nó bằng bản thân mình, nhưng bạn có thể làm như sau:

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

Một lựa chọn khác là sử dụng isPartialRequest() thay vì isAjaxRequest()

+0

Cảm ơn câu trả lời của bạn. Nghe hay đấy. Bạn có biết phương pháp này có tác dụng gì không? Có lẽ chỉ cần kiểm tra các tiêu đề quá. –

+0

@Matt, xin lỗi, không biết nó làm gì chính xác, nhưng các tùy chọn đang kiểm tra tiêu đề hoặc kiểm tra bản đồ tham số yêu cầu. – Osw

+0

Đã cập nhật câu hỏi của tôi. Có vẻ như giải pháp của tôi không an toàn. –

1

tôi muốn rằng nó là một cách đáng tin cậy để kiểm tra nó. Đây chính là cách ví dụ Django kiểm tra các yêu cầu AJAX:

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

Cũng liệt kê ở đây như vậy: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

+0

Cám ơn câu trả lời của bạn. Đã cập nhật câu hỏi của tôi. Có vẻ như giải pháp của tôi không an toàn. –

Các vấn đề liên quan