2011-12-19 100 views
2

我在glassfish上使用j_security_check验证jdbcRealm上的Glassfish连接到MSSQL数据库。 有没有什么办法来检查是否存在给定用户名的活动bean? 我只想显示在线上的网页上。我的猜测:如何检查用户何时通过会话过期退出

  1. 保持变量数据库,并登录/注销改变它。如果有人没有注销,但他的会话过期,问题就会发生。比我没有可能检查他是否仍然登录。
  2. 在bean中保留布尔变量,并使用登录/注销对其进行更改。问题与以前的机会一样。

会话过期时是否有方法更改此类变量?也许其他一些方法更常见?

+0

为什么不在成员数据库中为联机创建布尔字段,并且当他们的会话过期时将其设置为false? – 2011-12-19 20:37:04

+0

这是我一直在考虑的事情,但我不知道如何检查某人会话是否已过期,或者如何将变量变量平行地更改为过期。 – xwhyz 2011-12-19 20:45:44

回答

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代表登录的用户:

@ManagedBean 
@SessionScoped 
public class YourUser { 

    // ... 

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

} 

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

相关问题