我的 webapp 有登录的用户。有一个超时。在 session 过期之前,我想执行一个方法来清除一些锁。
我已经实现了一个 sessionListener
但是一旦我到达 public void sessionDestroyed(HttpSessionEvent event)
session 已经消失,我需要它的一些数据,所以我会喜欢在 session 实际过期之前执行一个方法(需要 session 处于 Activity 状态并且能够访问 FacesConfig.getCurrentInstance()
)。
我该怎么做?有任何想法吗?这是我的 session 监听器:
public class MySessionListener implements HttpSessionListener {
private static final Logger log = LoggerFactory.getLogger(MySessionListener.class);
public MySessionListener() {
}
public void sessionCreated(HttpSessionEvent event) {
log.debug("Current Session created : "
+ event.getSession().getId()+ " at "+ new Date());
}
public void sessionDestroyed(HttpSessionEvent event) {
// get the destroying session...
HttpSession session = event.getSession();
prepareLogoutInfoAndLogoutActiveUser(session);
log.debug("Current Session destroyed :"
+ session.getId()+ " Logging out user...");
/*
* nobody can reach user data after this point because
* session is invalidated already.
* So, get the user data from session and save its
* logout information before losing it.
* User's redirection to the timeout page will be
* handled by the SessionTimeoutFilter.
*/
// Only if needed
}
/**
* Clean your logout operations.
*/
public void prepareLogoutInfoAndLogoutActiveUser(HttpSession httpSession) {
UserBean user = FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{user}", UserBean.class);
LockBean lock = FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{lock}", LockBean.class);
lock.unlock(user.getUsername());
log.info("Unlocked examination for user: "+user.getUsername());
}
}
但我在 FacesContext.getCurrentInstance().getApplication()
处得到了 NullPointerException
因为 getCurrentInstance
为空或 getApplication
返回 null
最佳答案
您可以通过实现 HttpSessionBindingListener 来实现,您需要通过调用 registerSession
注册一个持有锁的 session (字符串“sessionBindingListener”可能不会更改)。容器将在 session 超时之后和 session 被销毁之前回调valueUnbound()
方法。
public class ObjectLock implements Serializable,HttpSessionBindingListener {
public void valueBound(HttpSessionBindingEvent event) {
log.info("valueBound:" + event.getName() + " session:" + event.getSession().getId() );
}
public void registerSession() {
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put( "sessionBindingListener", this );
log.info( "registered sessionBindingListener" );
}
public void valueUnbound(HttpSessionBindingEvent event) {
log.info("valueUnBound:" + event.getName() + " session:" + event.getSession().getId() );
// add you unlock code here:
clearLocksForSession( event.getSession().getId() );
}
}
关于java - 在 session 过期之前调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3943368/