2011-10-20 23 views
6

Tôi có câu hỏi về điều hướng khuôn mặt xung quanh.chuyển hướng khuôn mặt và nút quay lại khiến các liên kết khác hoạt động không chính xác

Vì vậy, tôi có một trang cần tham số yêu cầu để tải một người dùng cụ thể. Trang này hiển thị danh sách lệnh liên kết, khi được nhấp, chuyển hướng đến một trang khác bằng cách sử dụng điều hướng ngầm định. Người dùng được tải bằng cách gọi một phương thức trong "preRenderView".

Trang mà chúng tôi chuyển hướng đến cũng có tham số yêu cầu để xác định trường hợp cần tải. Trang cũng đang sử dụng preRenderView.

Cả hai trang đều có hạt được xem là phạm vi.

Tất cả đều hoạt động tuyệt vời cho liên kết FIRST được nhấn. Trang đầu tiên chuyển hướng đến URL mới và trường hợp tải như mong đợi.

BAO GIỜ, nếu tôi nhấp vào nút quay lại của trình duyệt và sau đó nhấp vào một liên kết khác mà trang KHÔNG chuyển hướng. Nó làm mới (thay vào đó) và, rõ ràng, không cửa hàng trường hợp.

Sau khi làm mới, tôi có thể nhấp vào liên kết và liên kết sẽ chuyển hướng chính xác.

Bây giờ, tất cả điều này hoạt động hoàn toàn tốt khi đậu của trang đầu tiên được giữ trong phiên nhưng tôi không muốn lạm dụng trạng thái phiên và tôi không nghĩ cần phải giữ dữ liệu này trong phiên.

Tôi biết tôi có thể khắc phục điều này bằng cách tự động tải lại trang khi tôi nhấp vào nút quay lại (vì chế độ xem sẽ được tạo lại) nhưng tôi không chắc đó có phải là giải pháp chính xác hay không. (Tôi cũng không chắc chắn làm thế nào tôi sẽ ép buộc điều này)

Có ai có bất cứ đề nghị nào không? Điều này có vẻ như một trường hợp sử dụng khá phổ biến nhưng tôi không thể tìm thấy bất kỳ ví dụ nào.

Cảm ơn!

Trả lời

11

Về cơ bản, bạn cần yêu cầu trình duyệt không lưu vào bộ nhớ cache các trang JSF được tạo động trong khi có phương thức lưu trạng thái xem được đặt thành (mặc định) server. Trạng thái xem được theo dõi bởi trường <input type="hidden" name="javax.faces.ViewState"> dưới dạng trang JSF được tạo với định danh trạng thái chế độ xem làm giá trị đầu vào. Khi bạn gửi một trang và điều hướng đến một trang khác, trạng thái xem được chuyển vào phía máy chủ và không tồn tại nữa. Lấy lại trang từ bộ nhớ cache của trình duyệt vẫn sẽ cung cấp cho bạn rằng số nhận dạng trạng thái xem cũ dưới dạng giá trị của đầu vào bị ẩn. Việc gửi biểu mẫu đó sẽ không hoạt động chút nào vì không có trạng thái xem nào ở phía máy chủ có thể được tìm thấy.

Bạn muốn nhận một trang mới ngay từ máy chủ thay vì từ bộ nhớ cache của trình duyệt. Để cho trình duyệt để làm điều đó, tạo ra một Filter như thế này:

@WebFilter(servletNames={"Faces Servlet"}) 
public class NoCacheFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpReq = (HttpServletRequest) request; 
     HttpServletResponse httpRes = (HttpServletResponse) response; 

     if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) 
      httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      httpRes.setDateHeader("Expires", 0); // Proxies. 
     } 

     chain.doFilter(request, response); 
    } 

    // ... 
} 

Bằng cách này, nút quay lại sẽ gửi một yêu cầu HTTP fullworthy mà nên tạo lại nhà nước xem và dẫn đến một trang với một hình thức với giá trị trường ẩn của trạng thái chế độ xem thích hợp.

+5

Balus, bạn là một vị thần. Cảm ơn. – jjross

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