我用google搜索和堆栈溢出了很多但是无法让它工作。这是我的代码。 我在subscribe方法中设置了一个会话属性“topic”,但是在sessionDestroyed中我把它作为null。 关于SO的This question似乎与我的相关,但没有解决问题。
@Path("/jpubsub/{topic}")
public class JMSSubscribe implements HttpSessionListener, ServletContextListener, MessageListener, ExceptionListener {
@GET
public subscribe(@javax.ws.rs.core.Context HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("topic", "1");
}
@Override
public void sessionCreated(HttpSessionEvent hse) {
HttpSession session = hse.getSession();
System.out.println("Created Session - ID : " + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent hse) {
System.out.println("Destroyed Session - ID : " + hse.getSession().getId());
System.out.println("Topic ID sessionDestroyed - " + hse.getSession().getAttribute("topic"));
}
请帮忙。
PS:当我在sessionCreated()
中设置属性时,我会在sessionDestroyed()
中获取该属性。
是因为我使用的是不同的会话对象吗?另外,当我打印会话ID时。我在所有3种方法中都获得了相同的会话ID。
请询问是否需要任何其他代码。
答案 0 :(得分:0)
调用sessionDestroyed()
后,会话中的所有对象都已清除。因此,您获得空值。相反,您应该实现HttpSessionBindingListener接口。
并且不要使用原始String对象存储在会话中,而是创建一个实现上述接口的简单对象。从会话中解除绑定(删除)后,您将获得该值。假设没有其他人删除它,它只会在会话被实际销毁之前被调用。
答案 1 :(得分:-1)
在会话创建方法
中设置会话属性@Path("/jpubsub/{topic}")
public class JMSSubscribe implements HttpSessionListener, ServletContextListener, MessageListener, ExceptionListener {
@GET
public subscribe(@javax.ws.rs.core.Context HttpServletRequest request) {
HttpSession session = request.getSession();
}
@Override
public void sessionCreated(HttpSessionEvent hse) {
HttpSession session = hse.getSession();
session.setAttribute("topic", "1");
System.out.println("Created Session - ID : " + session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent hse) {
System.out.println("Destroyed Session - ID : " + hse.getSession().getId());
System.out.println("Topic ID sessionDestroyed - " + hse.getSession().getAttribute("topic"));
}