2011-12-06 30 views
12

có cơ chế tích hợp để chuyển hướng có điều kiện sang chế độ xem khác không? Tôi muốn người dùng được chuyển hướng từ trang đăng nhập vào "trang chủ" nếu họ đã đăng nhập.Chuyển hướng có điều kiện trong JSF

Tôi đã có hai cách tiếp cận cơ bản, nhưng lần đầu tiên tôi không biết cách đạt được và thứ hai là một cách giải quyết dơ bẩn.

  1. Thêm <meta http-equiv="Refresh" content="0; URL=home.jsf" /> và để cho nó được trả lại có điều kiện (EL: #{login.loggedIn})
  2. Thêm một <h:panelGroup /> đó cũng sẽ được trả lại có điều kiện, có chứa một số hoạt Javascript làm chuyển hướng.

Có cách nào để đạt được hoặc thậm chí một giải pháp thanh lịch hơn? :-)

Cảm ơn

Trả lời

18

Bạn có thể sử dụng <f:event type="preRenderView"> cho việc này.

Ví dụ:

<f:event type="preRenderView" listener="#{login.checkAlreadyLoggedin}" /> 

với

public void checkAlreadyLoggedin() throws IOException { 
    if (isLoggedIn()) { 
     ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
     ec.redirect(ec.getRequestContextPath() + "/home.xhtml"); 
    } 
} 
+0

Perfect! Làm việc như một say mê, cảm ơn. Trong khi chờ đợi, tôi phát hiện ra và thử một cách tiếp cận khác: tôi đã triển khai một bộ lọc được đăng ký độc quyền cho trang đăng nhập, nhưng nó không thành công vì tôi không thể quản lý truy cập vào '' SessionScoped' 'login' bean hay' User' mà nó quản lý . Phiên họp trống ...?! – Kai

+0

Bộ lọc sẽ chỉ hoạt động đối với một JSF '@ ManagedBean', không phải cho một bean' 'Named' CDI. – BalusC

+0

Ah, Ok! Tôi nghĩ rằng điều này sẽ được đảm bảo bằng cách nào đó bởi thùng chứa JEE ... – Kai

0

Các giải pháp đặt ra bởi @BalusC không hoạt động trong trường hợp xem 'home.xhtml' không phải là giao diện mặc định của portlet JSF. Đối với những người cần chuyển hướng đến chế độ xem không mặc định trong giai đoạn hiển thị, tôi đề xuất giải pháp được đặt ra trong vòng this entry. Đó là, trong phương pháp preRenderView làm như sau:

FacesContext fc = FacesContext.getCurrentInstance(); 
NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler(); 
navigationHandler.handleNavigation(fc, null, "/views/nonDefaultView.xhtml?faces-redirect=true"); 
fc.renderResponse(); 

Tín dụng cho @Frizz1977

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