如何在会话对象被销毁之前调用方法?

发布于 2024-12-09 13:18:54 字数 338 浏览 0 评论 0原文

开发 JSP 应用程序时,可以定义会话超时值,例如 30 分钟。

超时后,会话对象将被销毁。 此外,我可以通过编程方式调用 session.invalidate() 使会话无效。

由于我在 HTTP 会话中保存了一个复杂的 Java 对象,因此在使会话无效或让 Tomcat 应用服务器过期之前,我需要调用保存的对象方法来释放一些内存。当然,当用户单击注销按钮时,我可以以编程方式执行此操作。

我想做的是在 Tomcat 应用程序服务器要销毁所有过期会话(30 分钟或自定义)时拦截 Tomcat 应用程序服务器,以便我可以预处理会话中保存的 Java 对象,调用特定方法来释放内存。

是否可以?

When developing a JSP application it's possible to define a session timeout value, say 30 minutes.

After that timeout, the session object is destroyed.
Moreover I can programmatically invalidate a session calling session.invalidate() .

Since I'm saving a complex Java object inside the HTTP session, before invalidate the session or let it expire by the tomcat app server, I need to call a saved object method to release some memory. Of course I can do it programmatically when the user click a logout button.

What I would like to do is intercepting the Tomcat app server when it is going to destroy all expired sessions (30 minutes or custom), so that I can pre-process Java objects saved in the session calling a specific method to release memory.

Is it possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

許願樹丅啲祈禱 2024-12-16 13:18:54

是的,这是可能的。您可以使用 HttpSessionListener 并在 sessionDestroyed() 方法中完成工作,

@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        // Do here the job.
    }

    // ...
}

或者您可以让存储为会话属性的复杂对象实现 HttpSessionBindingListener 并执行以下操作valueUnbound() 方法中的作业。

public class YourComplexObject implements HttpSessionBindingListener {

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        // Do here the job.
    }

    // ...
}

每当要从会话中删除对象时(通过 HttpSession#removeAttribute() 显式删除或通过会话失效/过期)都会调用它。

Yes, that's possible. You could use HttpSessionListener and do the job in sessionDestroyed() method,

@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        // Do here the job.
    }

    // ...
}

Or you could let the complex object which is been stored as a session attribute implement the HttpSessionBindingListener and do the job in valueUnbound() method.

public class YourComplexObject implements HttpSessionBindingListener {

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        // Do here the job.
    }

    // ...
}

It will be called whenever the object is to be removed from the session (either explicitly by HttpSession#removeAttribute() or by an invalidation/expire of the session).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文