2009-06-23 30 views
18

Câu hỏi này có liên quan đến câu hỏi khác của tôi "How to redirect to Login page when Session is expired in Java web application?". Dưới đây là những gì tôi đang cố gắng để làm:Xử lý 'phiên hết hạn' trong ứng dụng web JSF, chạy trong JBoss AS 5

  1. Tôi đã một ứng dụng JSF web chạy trên JBoss AS 5
  2. Khi người dùng không hoạt động trong, nói 15 phút, tôi cần phải đăng xuất người sử dụng và chuyển hướng anh ta đến trang đăng nhập, nếu anh ta đang cố gắng sử dụng ứng dụng sau khi phiên hết hạn.
  3. Vì vậy, như được đề xuất trong 'JSF Logout and Redirect', tôi đã triển khai bộ lọc kiểm tra điều kiện đã hết hạn phiên và chuyển hướng người dùng đến trang phiên-thời gian-out.jsp, nếu phiên đã hết hạn.
  4. Tôi đã thêm SessionExpiryCheckFilter lên trên tất cả các định nghĩa bộ lọc khác trong web.xml, do đó, kiểm tra hết hạn phiên của tôi sẽ nhận được lần truy cập đầu tiên luôn.

Bây giờ đến thử thách Tôi đang đối mặt với. Vì tôi đang sử dụng JBoss AS, khi phiên hết hạn, JBoss sẽ tự động chuyển hướng tôi đến trang đăng nhập (lưu ý rằng bộ lọc kiểm tra hết hạn phiên không được gọi). Vì vậy, sau khi tôi đăng nhập, SessionExpiryCheckFilter của tôi chặn yêu cầu và nó thấy một phiên có sẵn. Tuy nhiên, nó ném ngoại lệ javax.faces.application.ViewExpiredException: viewId:/mypage.faces - View /mypage.faces could not be restored.

Có ai phải đối mặt với vấn đề này trước đây không? Bất kỳ ý tưởng nào để giải quyết vấn đề này?

+0

Bạn đang sử dụng đường may? –

+0

Không. Tôi không sử dụng Seam. – Veera

+0

Bạn có đang sử dụng Facelets hoặc JSP không? – mtpettyp

Trả lời

15

Phương pháp sau đây làm việc cho tôi. Lưu ý rằng bạn phải sử dụng chuyển hướng taglib lõi JSTL và không chuyển hướng jsp để làm việc này (vì jsp cũng hết hạn).

Trong bạn FacesConfig.xml bạn đặt như sau:

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/sessionExpired.jsf</location> 
</error-page> 

sessionExpired.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<c:redirect url="/login.jsf" /> 

Bạn cũng có thể sử dụng phương pháp này với nhiều loại lỗi khác hoặc ngoại lệ. Ví dụ phần tử chứa một ánh xạ giữa một mã lỗi hoặc loại ngoại lệ và đường dẫn của một tài nguyên trong ứng dụng web .:

<error-page> 
    <error-code>400</error-code> 
    <location>/400.html</location> 
</error-page> 

hoặc thành phần chứa tên lớp đầy đủ của một loại ngoại lệ của Java.

<error-page> 
    <exception-type>javax.servlet.ServletException</exception-type> 
    <location>/servlet/ErrorDisplay</location> 
</error-page> 
0

Tôi khuyên bạn nên viết trình nghe phiên cùng với bộ lọc.

Khi phiên hết hạn, bạn có thể tạo đối tượng phiên mới và đặt giá trị thời gian chờ trên đối tượng mới.

Chỉ cần kiểm tra giá trị thời gian chờ trong bộ lọc và chuyển hướng trình duyệt.

Xem http://www.java2s.com/Code/Java/Servlets/Servletsessionlistener.htm

3

Nếu bạn đang sử dụng Mojarra/Sun RI, bạn có thể muốn thêm nội dung này vào web của mình.xml:

<context-param> 
    <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name> 
    <param-value>true</param-value> 
</context-param> 

Tuy nhiên, lưu ý rằng đây không phải là giải pháp hoàn hảo. Nó ẩn một thực tế là người dùng đã mất phiên của nó.

+0

Đây không phải là giải pháp tốt nhất. – Makky

1

Thực hiện javax.faces.event.PhaseListener cho Restore xem

@Override 
public void afterPhase(PhaseEvent event) { 
    FacesContext facesContext = event.getFacesContext(); 
    if(facesContext.getViewRoot()==null){ 
     try{ 
      facesContext.getExternalContext().redirect(HOME_PAGE); 
      facesContext.responseComplete(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void beforePhase(PhaseEvent event) {} 

@Override 
public PhaseId getPhaseId() { 
    return PhaseId.RESTORE_VIEW; 
} 

đăng ký trong faces-config.xml

0

Tôi cố gắng để viết một bộ lọc cho nó nhưng một số làm thế nào nó đã không làm việc cho tôi , vì vậy tôi đã thực hiện thay thế cho nó.

tôi đã làm nó như thế này trong mỗi trang mà tôi không muốn người dùng truy cập mà không cần đăng nhập:

<f:view> 
    <h:dataTable value="#{userHome.validuser()}"/> 
    // my code 
<f:view/> 

này sẽ gọi hàm validuser() mà là ở phiên tôi được quản lý đậu.

Đây là chức năng của tôi. Trong khi đăng nhập, tôi đã chèn đối tượng người dùng vào phiên.

public void validuser() 
{ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    UserLogin ul = (UserLogin) context.getExternalContext().getSessionMap().get("userbean"); 

    if (ul == null) 
     try{ 
       context.getExternalContext().redirect("/HIBJSF/faces/LoginPage.xhtml"); 
       context.responseComplete(); 
     } 
     catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
} 

Nếu có phiên nhưng không có ai đăng nhập, khi đó sẽ đưa bạn đến trang chuyển hướng.

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