2012-02-16 15 views
9

Có cách nào để đính kèm một người nghe toàn cầu vào tất cả các cuộc gọi AJAX trong JSF không? Có lẽ thông qua một người nghe giai đoạn hoặc một cái gì đó?Sử dụng JSF 2.0/Facelets, có cách nào để đính kèm trình nghe toàn cầu vào tất cả các cuộc gọi AJAX không?

Đây là câu hỏi hóc búa ... Cho phép nói rằng bạn đang sử dụng thẻ f: ajax và một cái gì đó như apache shiro và bạn để phiên của bạn hết hạn. Sau đó, bạn quay trở lại và nhấp vào một nút có một f: ajax gắn liền với nó. Máy chủ sẽ phản hồi bằng chuyển hướng 302 đến trang đăng nhập.

Người dùng không thấy gì. Họ có thể liên tục nhấp và gọi cuộc gọi ajax, nhưng đối với họ ứng dụng chỉ là "đã chết".

Vì vậy, mặc dù vậy, tôi có cách nào để đính kèm một người nghe vào tất cả các cuộc gọi ajax trong JSF không? Nếu vậy, điều tôi muốn làm là theo dõi mã phản hồi. Nếu đó là chuyển hướng, hãy sử dụng window.navigate để gửi chúng trên đường đi.

Tôi luôn cởi mở để biết cách người khác giải quyết vấn đề này! Cảm ơn!

+0

Sẽ không ["Lưu trạng thái ban đầu cho máy chủ và trạng thái chuyển thời gian chờ phiên cho khách hàng cho mọi thời gian phản hồi"] (http://stackoverflow.com/questions/10378133/initial-state-saving-to-server -on-session-timeout-transfer-to-client-cho-tất cả-t) là một giải pháp tốt hơn cho điều này hơn là tất cả những thứ hacky? Tôi tự hỏi tại sao JSF đã không cung cấp này và nếu tôi bằng cách nào đó có thể thực hiện điều này. –

Trả lời

16

Có cách nào để đính kèm trình nghe toàn cầu vào tất cả các cuộc gọi AJAX trong JSF không? Có lẽ thông qua một người nghe giai đoạn hoặc một cái gì đó?

Có, PhaseListener có thể làm điều đó. A SystemEventListener. A Filter.

Nếu bạn đang ở trong bối cảnh JSF, thì bạn có thể kiểm tra như sau liệu yêu cầu hiện tại có phải là yêu cầu ajax hay không.

if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) { 
    // It's an ajax request. 
} 

Nếu bạn không ở trong ngữ cảnh JSF, ví dụ: bên trong một Filter, sau đó bạn có thể kiểm tra như sau cho dù yêu cầu hiện tại là một yêu cầu AJJ ajax hay không.

if ("partial/ajax".equals(request.getHeader("Faces-Request"))) { 
    // It's a JSF ajax request. 
} 

Đây là câu hỏi hóc búa ... Hãy nói rằng bạn đang sử dụng f: ajax thẻ và một cái gì đó giống như shiro apache và bạn hãy để phiên của bạn hết hạn. Sau đó, bạn quay trở lại và nhấp vào một nút có một f: ajax gắn liền với nó. Máy chủ sẽ phản hồi bằng chuyển hướng 302 đến trang đăng nhập.

Người dùng không thấy gì. Họ có thể liên tục nhấp và gọi cuộc gọi ajax, nhưng đối với họ ứng dụng chỉ là "đã chết".

Buộc chuyển hướng trên yêu cầu ajax yêu cầu phản hồi XML đặc biệt. Khi bạn đang ở trong bối cảnh JSF, thì ExternalContext#redirect() đã xem xét điều này một cách ngầm định. Tất cả những gì bạn cần làm là viết điều này:

FacesContext.getCurrentInstance().getExternalContext().redirect(url); 

Nếu bạn không ở trong ngữ cảnh JSF, ví dụ: bên trong một Filter, sau đó bạn cần tự mình viết toàn bộ phản hồi XML. Ví dụ.

response.setContentType("text/xml"); 
response.getWriter() 
    .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>") 
    .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", url); 
+0

TSo Tôi đoán tuyến đường tối ưu là viết bộ lọc nằm trước bộ lọc Shiro. Khi Shiro gửi một chuyển hướng, bộ lọc của tôi sẽ chặn nó và gửi XML. Tôi có cảm giác mình không thể làm điều này bên trong ứng dụng khuôn mặt vì Shiro sẽ chặn yêu cầu. –

+0

Đặt cược tốt nhất của bạn sau đó thực sự là một bộ lọc ở phía trước của bộ lọc Shiro. – BalusC

+1

Để biết thông tin của bạn, tôi đã viết về chính xác trường hợp này và cung cấp bộ lọc hoàn chỉnh sẵn sàng cho Shiro: http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for- java-ee-6.html # MakeShiroJSFAjaxAware – BalusC

4

Để chuyển hướng yêu cầu JSF ajax bạn cần xml như sau

<?xml version="1.0" encoding="UTF-8"?> 
<partial-response> 
     <redirect url="XXX"> 
     </redirect> 
</partial-response> 

Đây XXX là url bạn muốn chuyển hướng xảy ra.

Trên chuyển hướng cuộc gọi ajax được gửi không như trên, do đó không có chuyển hướng.

Để có được kết quả mong muốn có một bộ lọc cho tất cả các yêu cầu JSF trừ vài trang (trang đăng nhập) và kiểm tra phiên là hợp lệ và nếu nó thực sự JSF ajax cuộc gọi bằng cách kiểm tra tiêu đề "Faces-Request", nó giá trị phải là "một phần/ajax". Nếu phiên đã hết hạn và yêu cầu ajax gửi trên xml làm phản hồi.

Nó sẽ hoạt động.

+0

Không [trạng thái ban đầu Tiết kiệm cho máy chủ và trạng thái chuyển thời gian chờ phiên cho khách hàng cho mọi thời gian phản hồi "] (http://stackoverflow.com/questions/10378133/initial-state-saving-to-server-on-session- timeout-transfer-to-client-for-all-t) là một giải pháp tốt hơn cho điều này hơn là tất cả những thứ hacky? Tôi tự hỏi tại sao JSF đã không cung cấp này và nếu tôi bằng cách nào đó có thể thực hiện điều này. –

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