如何拦截会话结束并获取属性?
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) 方法以根据您的要求进行自定义。
【讨论】:
以上是关于如何拦截会话结束并获取属性?的主要内容,如果未能解决你的问题,请参考以下文章
如何监控正在运行的屏幕会话并在最后一个会话结束后开始新会话?