登录后如何正确注销 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,它使用以下方式使会话无效:

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

而且,应用程序 UI 应该提供一个链接来调用 logout servlet/jsp

问题:确实,我如何在会话超时等情况下强制注销?

答案: web.xml 中的&lt;session-timeout&gt; 允许您定义超时值,在此之后会话将被服务器无效。

【讨论】:

感谢 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Flutter app:如何实现正确的注销功能?

注销后如何防止浏览器的后退按钮登录

注销后 JWT 的使用

登录后重定向错误(Java EE w/JSF)

登录到网站后,它会根据检查“网络”重定向到正确的页面,但是会注销并重新加载登录页面

用户登录并重定向到主页后,如何在主页导航栏中隐藏登录链接并显示注销链接?