登录后如何正确注销 Java EE 6 Web 应用程序
Posted
技术标签:
【中文标题】登录后如何正确注销 Java EE 6 Web 应用程序【英文标题】:How to properly logout of a Java EE 6 Web Application after logging in 【发布时间】:2012-06-09 06:13:36 【问题描述】:一个非常简单的要求。登录到 Web J2EE 6 应用程序后,如何让用户再次注销?
我见过的大多数(全部?)书籍和教程都展示了如何向他们的应用程序添加登录/登录错误页面,并使用“j_security_check”方法演示安全主体/角色/领域等的使用——一切都很好。但是目前还不清楚如何赋予用户注销的权力。确实,我如何在会话超时等之后强制注销?
【问题讨论】:
【参考方案1】:您可以使用logout()
的HttpServletRequest
方法以编程方式执行此操作。
使用用户名和密码登录也有相应的方法。这些方法已添加到 Servlet 3.0 中,因此它们在 Java EE 6 中可用。
超时是另一种野兽,可以在web.xml
中指定如下:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
时间单位是分钟。
【讨论】:
这仅在 Servlet 3.0 之后可用 是的,但是问题特别提到了 JEE 6,所以 Servlet 3.0 很好【参考方案2】:您应该拥有logout servlet/jsp
,它使用以下方式使会话无效:
session.invalidate() method
也会使会话无效。
Servlet 3.0 提供了一个 API 方法 HttpServletRequest.logout()
,它只使安全上下文无效并且会话仍然存在。
而且,应用程序 UI 应该提供一个链接来调用 logout servlet/jsp
问题:确实,我如何在会话超时等情况下强制注销?
答案: web.xml 中的<session-timeout>
允许您定义超时值,在此之后会话将被服务器无效。
【讨论】:
感谢 Ramesh - 我认为这让我能够正确地将它们组合在一起。我在别处了解到的一件事是return "/index?faces-redirect=true";
的重要性——这是中断现有会话和可能正在进行的任何客户端缓存所必需的。
为了清楚起见 Servlet 3.0,您必须同时执行 logout() 和 session.invalidate()?
如果你在没有使会话失效的情况下注销,你应该有一个很好的理由,因为它会让你暴露信息。有意注销的用户希望被视为从未登录过——尤其是当他们使用公共终端时!见owasp.org/index.php/…
可能我不太明白这个答案:“在 web.xml 中,您可以定义超时值,在此之后会话将被服务器无效”我知道这个会话超时是会话失效后容器等待;这是不正确的,因为这个会话超时参数是容器在没有收到请求时等待的时间,可以使会话无效。【参考方案3】:
两步流程 -
1.创建注销页面 2.创建一个带有注销方法的会话bean
步骤 A:注销页面
<div class="mytext">
<p>Hello #userSession.username, </p>
<p><h:outputText value="It doesn't seem you're logged in anyway..." rendered="#!userSession.userLoggedIn" /></p>
</div>
<h:form class="mytext" rendered="#userSession.userLoggedIn" >
<h:panelGrid columns="2" >
<h:outputLabel value="Do you want to logout?" for="logout" />
<p:commandButton value="Logout" id="logout" action="#userSession.logout" />
</h:panelGrid>
</h:form>
步骤 B:会话 Bean 支持代码 (sn-p)
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;
【讨论】:
以上是关于登录后如何正确注销 Java EE 6 Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章