如何检查用户何时按会话到期注销

时间:2011-12-19 20:34:57

标签: jsf glassfish httpsession

我使用j_security_check验证在glassfish上使用JSF Web应用程序,并在连接到MSSQL db的glassfish上使用jdbcRealm。 有没有办法检查例如是否存在具有给定用户名的活动bean? 我只想在网页上显示谁在线。我的猜测:

  1. 将变量保存在数据库中并使用login / logout进行更改。如果有人没有注销但他的会话到期,则会出现问题。比我没有可能检查他是否仍然登录。
  2. 在bean中保留boolean变量并使用login / logout更改它。问题与之前的机会一样。
  3. 会话到期时有没有办法改变这样的变量?也许其他一些方法更常见?

1 个答案:

答案 0 :(得分:2)

  

如果有人没有注销但会话过期,则会出现问题。比我没有可能检查他是否仍然登录。

您可以实施HttpSessionListener

@WebListener
public class YourUserSessionListener implements HttpSessionListener {

    @Override 
    public void sessionCreated(HttpSessionEvent event) {
        // NOOP.
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        YourUser yourUser = event.getSession().getAttribute("yourUser");

        if (yourUser != null) {
            yourUser.logout(); // Update DB.
        }
    }

}

其中YourUser是表示登录用户的会话作用域JSF托管bean。

或者当您使用JSF2时(正如您的问题历史记录所确认的那样),将@PreDestroy放在代表登录用户的会话作用域JSF托管bean中的logout方法上:

@ManagedBean
@SessionScoped
public class YourUser {

    // ...

    @PreDestroy
    public void logout() {
        // Update DB.
    }

}

这样,在会话到期时bean被销毁之前,将调用该方法。