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

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

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

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

谢谢!

【问题讨论】:

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

标签: java spring session spring-mvc spring-security


【解决方案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容器是否会让你在会话已经销毁后获取属性,但这值得一试。

    在这种情况下:

    1. 实现HttpSessionListener接口。我们称之为 com.app.MySessionListener
    2. sessionDestroyed(HttpSessionEvent e)中,编写如下代码:

      Object attr = e.getSession().getAttribute("attr_name");
      
    3. 将此“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) 方法以根据您的要求进行自定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多