2013-02-21 33 views

Trả lời

16

Bạn cần phải vô hiệu hóa phiên hiện tại bằng cách gọi hàm sau trong phương pháp hành động của bạn:

FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 

Ngoài ra, như phiên scoped đậu được vào thùng rác chôn các yêu cầu tiếp theo, hãy chắc chắn để gửi một chuyển hướng:

FacesContext.getCurrentInstance().getExternalContext().redirect("/login.xhtml"); 

Hoặc, chỉ cần trả về một kết quả trường hợp chuyển hướng từ phương pháp của bạn:

return "login.xhtml?faces-redirect=true"; 

Trong trường hợp bạn không muốn làm mất hiệu lực phiên và, một cách hiệu quả, duy trì phiên của bạn scoped đậu (đó là một thực tế xấu theo ý kiến ​​của tôi), chỉ cần vô hiệu hóa tất cả các dữ liệu người dùng (được hy vọng thu được trong một phiên quản lý phạm vi đậu) trong phương pháp đăng xuất (bạn có thể cần phải tiêm đậu đó trong trường hợp phương thức đăng xuất nằm trong một phiên phạm vi đậu).

-2

Khi logout người dùng, phiên bị phá hủy và tất cả các đối tượng SessionScoped ManagedBean quá

+2

"đăng xuất" không theo định nghĩa "phiên bị hủy". Tuy nhiên, cách khác vòng thường thực sự là. – BalusC

+0

Tôi không đồng ý. Đăng xuất có nghĩa là "vô hiệu phiên" thường lệ. Đó là thực hành tốt nhất và nó là mô hình phổ biến. Không phá hủy phiên tạo ra vấn đề an ninh –

+1

Uh, chắc chắn rồi. Nếu đúng như vậy, OP sẽ không hỏi câu hỏi này ngay từ đầu :) – BalusC

3

Bạn không cần phải xóa phiên scoped quản lý đậu bằng tay. Chỉ cần xóa phiên người dùng. Bằng cách sử dụng mã sau trong servlet để đăng xuất.

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    System_Properties system_Properties=new System_Properties(); 
    PrintWriter out = response.getWriter(); 
    try { 
     request.getSession().invalidate();    
    }finally { 
     out.close(); 
    } 
} 

Nếu bạn vẫn xóa thủ công dữ liệu bean được quản lý thì có thể thực hiện bằng cách sử dụng mã sau.

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("managed_bean_name", null); 

Trong trường hợp "mananged_bean_name" là tên của bean được quản lý của bạn.

Hy vọng nó giúp

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