如何拦截会话结束并获取属性?

Posted

技术标签:

【中文标题】如何拦截会话结束并获取属性?【英文标题】:How intercept end of session and get attribute? 【发布时间】:2014-04-26 01:35:59 【问题描述】:

您好,我需要在我的网络应用程序中拦截会话的到期。

我会拦截它,因为我想获得一个会话属性,并在销毁会话之前存储它。

有可能吗??你能给我一些建议吗??

谢谢!

【问题讨论】:

您能否详细说明为什么要在会话到期时存储属性?是不是可以独立于到期时间来存储它?顺便说一句,如果您希望它不在会话中,您可以将其存储在会话之外! (即在磁盘、数据库等上) 【参考方案1】:

您可以使用HttpSessionListener。

看起来像这样:

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class MyHttpSessionListener implements HttpSessionListener 

  @Override
  public void sessionDestroyed(HttpSessionEvent se) 
    Object attribute = se.getSession().getAttribute("foo");
  

  @Override
  public void sessionCreated(HttpSessionEvent se) 
  


【讨论】:

【参考方案2】:

我认为您想在会话被销毁之前从会话中获取属性并将其“存储”到其他地方。

下面使用的sessionDestroyed是在会话销毁后调用的,我不确定servlet容器是否会让你在会话已经销毁后获取属性,但这值得一试。

在这种情况下:

    实现HttpSessionListener接口。我们称之为 com.app.MySessionListener

    sessionDestroyed(HttpSessionEvent e)中,编写如下代码:

    Object attr = e.getSession().getAttribute("attr_name");
    

    将此“attr”对象存储在其他位置。

即使会话被销毁,你仍然会有一个对“attr”对象的引用。

通常,您将在 web.xml 中注册 MySessionListener:

<web-app ...>
    <listener>
        <listener-class>com.app.MySessionListener</listener-class>
    </listener>
</web-app>

【讨论】:

" 对象属性 = e.getSession().getAttribute("attr_name"); " 返回 null 这里有同样的问题。看起来像一个并发问题:会话属性几乎总是null...找不到原因!【参考方案3】:

实现 HttpSessionListener 并覆盖 sessionDestroyed(HttpSessionEvent event) 方法以根据您的要求进行自定义。

【讨论】:

以上是关于如何拦截会话结束并获取属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何监控正在运行的屏幕会话并在最后一个会话结束后开始新会话?

如何结束用户会话令牌并刷新令牌,时间超过 25 分钟

单选按钮和会话,如何获取值并用作会话变量

如何计算给定会话日志的峰值并发用户

如何确保 SFTP 会话始终在 spring-batch 结束时关闭

如何将Google Analytics会话与应用会话统一?