2010-09-17 32 views
7

Tôi đang tạo webapp bằng Tapestry kết hợp với Spring Security và thư viện jQuery bên cạnh Prototype. Khi người dùng nhấp vào liên kết sau khi phiên của anh ấy hết hạn, anh ấy sẽ tự động được chuyển hướng đến trang đăng nhập. Điều này, tất nhiên, không hoạt động cho các liên kết, kích hoạt một yêu cầu AJAX.Lỗi thời gian chờ của phiên AJAX trong ứng dụng Tapestry

Tôi biết, đây là sự cố phổ biến với bất kỳ loại ứng dụng web nào (ví dụ: http://www.openjs.com/articles/ajax/session_timeout.php). Có giải pháp thực hành tốt nhất cho Tapestry 5 không?

EDIT Các giải pháp sau đây (nhờ Henning) làm việc cho tôi:

Ajax.Responders.register(
{ 
    onException: function() 
    { 
     window.location.reload(); 
    } 
}); 

Trong trường hợp của một sự thất bại trong một cuộc AJAX gọi một tải lại trang được kích hoạt, do đó kết quả chuyển hướng để đăng nhập -trang. Nó vẫn cần một số điều chỉnh (ví dụ như hiển thị một thông báo lỗi thay vì chuyển hướng), nhưng sử dụng Ajax.Responders về cơ bản có vẻ là một cách tốt để làm điều đó.

+0

làm những gì tác giả đề xuất trong bài viết. gặp nó từ javascript. – Adeel

+1

Chỉ cần tải lại trang là một giải pháp rất thanh lịch; Tôi sẽ làm cho rằng mặc định mới cho các ứng dụng của tôi. Cảm ơn! – Henning

Trả lời

4

Đối với AJAX sử dụng Prototype, bạn có thể thêm trình nghe toàn cầu phản ứng với lỗi AJAX bằng cách sử dụng AJAX.Responders; jQuery có cấu trúc tương tự được gọi là Ajax Events mà bạn có thể sử dụng.

Cả trình xử lý sự kiện sẽ chỉ chuyển hướng đến trang đăng nhập trên lỗi 403. Bạn có thể tạo một mixin với chức năng này và thêm nó vào thành phần bố cục của bạn.

Tôi cũng đã sử dụng cơ chế ngăn thời gian chờ phiên trong khi ứng dụng vẫn mở trong cửa sổ trình duyệt bằng cách thực hiện cuộc gọi AJAX và nhận phản hồi trống mỗi vài phút, do đó giữ phiên mở. Ngu ngốc, nhưng không sao.

+0

Cảm ơn bạn đã chỉ ra AJAX.Responders. Điều này hoạt động độc đáo! – martin

0

Vâng, yêu cầu Ajax được gửi tới máy chủ, nó sẽ gửi tiêu đề "HTTP_X_REQUESTED_WITH" có giá trị "XMLHttpRequest". Bạn có thể chỉ cần kiểm tra serverside rằng cho dù đó là yêu cầu ajax với tiêu đề trên và điều kiện để đăng nhập và thời gian chờ phiên trước khi tiến xa hơn trong trang chỉ mục của bạn.

Nếu tiêu chí của bạn được so khớp thì chỉ cần in "window.top.location.href = 'trang đăng nhập'" trong chức năng của bạn.

Trong PHP tôi có thể làm điều này như,

<?php if($_SERVER['HTTP_X_REQUESTED_WITH'] === "XMLHttpRequest" && condition for session check){ 
    echo "<script>window.top.location.href='login.php'</script>"; 
    } 

?> 

Bạn có thể thêm các điều kiện tương tự như nó trong khuôn khổ của bạn.

3

bạn có thể đóng góp T5 thạc sĩ phối

 

public class AjaxAccessController implements Dispatcher { 

    @Override 
    public boolean dispatch(Request request, Response response) throws IOException { 

     // Si no hay session y la petición es ajax, recargar la página 
     Session session = request.getSession(false); 
     if (session == null && request.isXHR()) { 
      OutputStream os = response.getOutputStream("application/json;charset=UTF-8"); 
      os.write("{\"script\":\"window.location.reload();\"}".getBytes()); 
      os.flush(); 
      return true; 
     } 

     return false; 
    } 
} 
 

Trong AppModule.java bạn

 

public static void bind(ServiceBinder binder) { 
     // binder.bind(MyServiceInterface.class, MyServiceImpl.class); 
     // Make bind() calls on the binder object to define most IoC services. 
     // Use service builder methods (example below) when the implementation 
     // is provided inline, or requires more initialization than simply 
     // invoking the constructor. 

     // Id de AjaxAccessController 
     binder.bind(AjaxAccessController.class).withId("AjaxAccessController"); 
    } 

public void contributeMasterDispatcher(
      OrderedConfiguration configuration, 
      @InjectService("AjaxAccessController") Dispatcher accessController) { 

     configuration.add("AjaxAccessController", accessController, "before:ComponentEvent"); 
    } 
 

Vì vậy, mọi yêu cầu ajax mà không phiên, trang sẽ load lại và nó chuyển hướng đến trang index của bạn

+0

Điều này không phù hợp với tôi trên Tấm thảm 5.3.7. Thay vào đó, tôi đã sử dụng một ComponentRequestFilter để làm những gì bạn đã làm trong Dispatcher. –

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