我正在使用一个servlet,在这个内部我需要为每个用户创建一个对象实例,通常我会使用单例执行它但是因为(据我所知),servlet本身就像单身人士一样工作有点困惑:
如何为每个会话/用户生成一个实例? 我怎么能确定它会在会话超时时被销毁?
什么是最好的方法,等待HttpServlet的某些事件或对访问某些属性的请求采取行动以了解正在调用的会话?
编辑: 实际场景是一个使用外部组件进行数据访问的Web应用程序,这个对象对数据检索的作用并不感兴趣,可能是db访问或Web服务调用我可以忽略它。 我必须为每个Httpsession创建一个这个对象的实例,并确保它会在会话到期后被销毁。
修改
似乎HttpSessionListener可以是一个解决方案:我可以创建我的对象,在会话创建时会在Map中将其与sessionid相关联,会话中的销毁到期。任何人都有这方面的经验吗?
答案 0 :(得分:0)
不确定您在做什么,但最简单的方法是为每个已启动的会话创建客户端cookie。
Cookie本身可以有一个到期时间,并且您将保持每个会话的服务器轨道,其中密钥是生成的cookie。
一旦客户端有cookie,他就会在每个请求中使用它,以便保持在同一个会话中。
当然,您需要一种方法让每个用户登录并获取他的cookie,并使用一些服务器逻辑来删除未使用的会话......等等。
答案 1 :(得分:0)
简单的解决方案:
在下面的描述中,Blammy是每个会话对象名称
答案 2 :(得分:0)
您可以使用HttpSessionEvent。在会话创建时,使用常量键添加会话属性,并将对象实例添加为值。
答案 3 :(得分:0)
对于简单的情况,您可以使用HttpSessionListener
,如下所示:
@WebListener
public class MySessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
// new session created - add your singleton
Foo f = new Foo();
se.getSession().setAttribute("Foo", f);
// if you need id you can use - se.getSession().getId();
}
public void sessionDestroyed(HttpSessionEvent se) {
// session destroyed - do cleanup
Foo f = (Foo) se.getSession().getAttribute("Foo");
f.destroy(); // your object cleanup method
}
}
如果需要在具有会话复制的群集中运行它,那么您的类应该很小且Serializable
,否则您需要实现Map解决方案并HttpSessionActivationListener
以在其他JVM上恢复其状态