我用谷歌搜索和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对象存储在会话中,而是创建一个实现上述接口的简单对象。从会话中取消绑定(删除)时,您将获得该值。假设没有其他人删除它,它将仅在会话实际销毁之前被调用。

10-08 00:39