如何在登录后正确注销Java EE 6 Web应用程序

一个非常简单的要求。 登录到Web J2EE 6应用程序后,如何让用户再次注销?

我见过的大多数(全部?)书籍和教程都展示了如何将login / loginerror页面添加到他们的应用程序中,并使用“j_security_check”方法演示安全主体/角色/领域等的使用 – 一切都很好。 但是,目前尚不清楚如何赋予用户注销权。 实际上,如何在会话超时等之后强制退出?

您应该使用以下方式logout servlet/jsp ,这会使会话失效:

  • 在Servlet 3.0之前,使用session.invalidate() method也会使会话无效。
  • Servlet 3.0提供了一个API方法HttpServletRequest.logout() ,它只使安全上下文无效,并且会话仍然存在。

并且,Application UI应该提供一个调用logout servlet/jsp的链接

问题:确实,如何在会话超时等之后强制退出?

答案: web.xml中的允许您定义超时值,之后服务器将使会话失效。

您可以使用logout()HttpServletRequest方法以编程方式执行此操作。 还有一个用户名和密码登录的相应方法。 Servlet 3.0中添加了这些方法,因此它们可以在Java EE 6中使用。

超时是一种不同的野兽,可以在web.xml指定如下:

  30  

时间单位是分钟。

两步过程 –

1.创建注销页面
2.使用logout方法创建会话bean

步骤A:退出页面

 

Hello #{userSession.username},

步骤B:会话Bean支持代码(代码段)

 public String logout() { HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); session.invalidate(); return "/index?faces-redirect=true"; } public boolean isUserLoggedIn() { String user = this.getUsername(); boolean result = !((user == null)|| user.isEmpty()); return result; } /** Get the login username if it exists */ public String getUsername() { String user = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser(); return user; }