【问题标题】:How to check when the user is logged out by session expiration如何通过会话到期检查用户何时注销
【发布时间】:2012-01-23 22:19:13
【问题描述】:

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

  1. 在数据库中保留变量并通过登录/注销来更改它。如果有人没有注销但他的会话过期,则会出现问题。比我无法检查他是否仍然登录。
  2. 在 bean 中保留布尔变量并通过登录/注销来更改它。问题与之前的机会一样。

有没有办法在会话到期时更改此类变量?也许其他一些方法更常见?

【问题讨论】:

  • 为什么不在会员数据库中为在线创建一个布尔字段,并且当他们的会话到期时将其设置为false?
  • 这是我一直在考虑的事情,但我不知道如何检查某人的会话是否已过期,或者如何将变量并行更改为此类过期。

标签: jsf glassfish httpsession


【解决方案1】:

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

您可以通过实现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 中的注销方法上:

@ManagedBean
@SessionScoped
public class YourUser {

    // ...

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

}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 2012-04-19
    • 1970-01-01
    • 2013-10-07
    • 2017-12-12
    • 2018-03-01
    • 2011-11-14
    • 2022-01-06
    相关资源
    最近更新 更多