当前位置: 首页 > 面试题库 >

会话过期前调用方法

齐鸿光
2023-03-14
问题内容

我的webapp有登录的用户。有超时。在会话到期之前,我想执行一种方法来清除一些锁。

我已经实现了一个,sessionListener但是一旦到达public void sessionDestroyed(HttpSessionEvent event)会话,会话就已经消失了,我需要从中获取一些数据,因此我想FacesConfig.getCurrentInstance()在会话实际过期之前执行一个方法(该会话需要运行并可以访问)。

我怎样才能做到这一点?有任何想法吗?这是我的会话监听器:

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());
    }
}

但我要去NullPointerExceptionFacesContext.getCurrentInstance().getApplication()原因getCurrentInstance是null或getApplication返回null


问题答案:

您可以通过实现HttpSessionBindingListener来实现,您需要通过调用来注册一个持有锁的会话registerSession(字符串“
sessionBindingListener”可能不会更改)。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() );
    }
}


 类似资料:
  • 我在Tomcat7中有一个web应用程序,它将会话中的用户信息作为DTO对象保存。我还为我的项目启用了Spring Security性,如果用户没有会话,它会自动将用户重定向到登录页面。 如果我登录到应用程序一次,然后在Eclipse中重新启动Tomcat,会发生的情况是,我的会话被冲出,但cookie没有运行。 Edit:尽管Firefox说,但如果关闭并重新启动Firefox,cookie仍然

  • 我尝试从控制器调用Birt报告,如下所示: 我真正做的是调用一个控制器,该控制器调用另一个Tomcat服务器上存在的birt报告,但我收到以下错误: 堆栈跟踪: 这是从API调用Bert报告的最佳方式吗?

  • 问题内容: 我有一个会话验证过滤器,当会话过期时该过滤器注销用户。 这是一段代码,但是没有用。不起作用意味着即使会话过期,它也不会重定向到登录页面。 请帮助我解决此问题。 问题答案: 我有一个会话验证过滤器,当会话过期时该过滤器注销用户。 老实说,这完全没有道理。如果将已登录用户存储为会话的属性,并基于会话中已登录用户的存在来拦截“已登录”状态,则在任何时候都不需要手动注销该用户。会话已过期。当会

  • 首先;这个问题类似于另一个尚未解决的问题:对magento soap api的调用立即过期 我正在开发一个基于XMLRPC的客户端-服务器模块。基于Magento的服务器向基于Java的客户端公开了几个API方法。我在我的客户端中使用标准JavaXMLRPC Jars。 我有一个“登录”调用,用于检索会话。然后我把这个传给其他人做不同的电话。我检查了它是否返回(看起来)有效会话。 但是,我使用此会

  • 问题内容: 我们的应用程序在30分钟后注销并重定向到登录页面,我在web.xml中指定会话超时,并使用requestProcessor进行重定向。我想向用户显示一条消息,指出会话过期后会话已过期,如何我可以这样做吗?自动注销?我想在“会话超时,请重新登录”页面上提示错误消息。那我怎么能检测到会话超时呢?有什么方法会自动触发吗? 问题答案: 创建一个活动检查器,该检查器每分钟检查是否发生了任何用户活

  • 我打算使用paramiko在远程主机上运行几个命令,但ssh会话在运行一个命令后关闭。 下面列出的代码: 那么有什么方法可以阻止ssh会话关闭吗?或者帕拉米科的替代品? 有什么方法可以让paramiko ssh会话一直处于活动状态吗? paramiko调试模式信息返回如下: 启动线程(客户端模式):0x2657E10L 已连接(版本1.99,客户端组件-5.20) kex ALGOS:[u'dif