20

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

我见过的大多数(全部?)书籍和教程都展示了如何向他们的应用程序添加登录/登录错误页面,并使用“j_security_check”方法演示安全主体/角色/领域等的使用——一切都很好。但是目前还不清楚如何赋予用户注销的权力。确实,我如何在会话超时等之后强制注销?

4

3 回答 3

27

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

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

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

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

答: web.xml 中的<session-timeout>内容允许您定义超时值,在此之后会话将被服务器无效。

于 2012-06-05T08:16:52.940 回答
5

您可以使用logout()-Method 以编程方式进行HttpServletRequest。也有相应的使用用户名和密码登录的方法。这些方法已添加到 Servlet 3.0 中,因此它们在 Java EE 6 中可用。

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

<session-config>
  <session-timeout>30</session-timeout> 
</session-config>

时间单位是分钟。

于 2012-06-05T08:19:05.780 回答
1

两步过程 -

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 支持代码(片段)

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;
}    
于 2012-06-06T00:31:09.847 回答