我用谷歌搜索和stackoverflowed很多,但不能使它工作。这是我的代码。
我在订阅方法中设置了会话属性“主题”,但在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。
请询问是否需要其他代码。
最佳答案
调用sessionDestroyed()
之后,会话中的所有对象均已清除。因此,您将获得空值。相反,您应该实现HttpSessionBindingListener接口。
并且不要使用原始String对象存储在会话中,而是创建一个实现上述接口的简单对象。从会话中取消绑定(删除)时,您将获得该值。假设没有其他人删除它,它将仅在会话实际销毁之前被调用。