在HttpSessionListener的sessionDestroyed()方法中没有得到会话属性

时间:2013-09-27 09:11:54

标签: java session httpsession

我用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。

请询问是否需要任何其他代码。

2 个答案:

答案 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"));
    }