HttpSessionListener.sessionCreated()未被调用

时间:2016-12-11 04:04:18

标签: java servlets httpsession

我有一个非常简单的Servlet和一个非常简单的HttpSessionListener:

@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet {
    private static final long serialVersionUID = 1L;


    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        getServletContext().setAttribute("applicationHits", new AtomicInteger(0));  
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("get");

        ((AtomicInteger) request.getServletContext().getAttribute("applicationHits")).incrementAndGet();
        ((AtomicInteger) request.getSession(true).getAttribute("sessionHits")).incrementAndGet();
        request.setAttribute("requestHits", 0);

        getServletContext().getRequestDispatcher("/view/HelloWorld.jsp").forward(request, response);
    }

}

@WebListener
public class SessionListener implements HttpSessionListener {

    public SessionListener() {
    }

    public void sessionCreated(HttpSessionEvent arg0)  {
        System.out.println("session listener");
        arg0.getSession().setAttribute("sessionHits", new AtomicInteger(0));
    }

    public void sessionDestroyed(HttpSessionEvent arg0)  { 
    }

}

永远不会调用我的HttpSessionListener.sessionCreated()方法(没有日志输出),我最终在我调用getSession()

的行上获得NullPointerException
((AtomicInteger) request.getSession(true).getAttribute("sessionHits")).incrementAndGet();
        request.setAttribute("requestHits", 0);

我尝试在没有getSession()的情况下调用true,但同样的问题。

我不明白 - @WebListener注释不足以调用我的听众吗? Eclipse甚至在Deployment Descriptor/Listeners下将其显示为监听器。

3 个答案:

答案 0 :(得分:1)

原来这是一个愚蠢的Eclipse问题......

Project-> Clean ...并重新启动Tomcat就可以了。

答案 1 :(得分:0)

如果您不使用@WebListener,请确保在web.xml中引用了您的侦听器。

<web-app>...
    <listener>
        <listener-class>com.yoursite.YourSessionListener</listener-class>
    </listener>

In order to receive these notification events, the implementation class must be either declared in the deployment descriptor of the web application, annotated with WebListener, or registered via one of the addListener methods defined on ServletContext.

答案 2 :(得分:0)

好吧,我将在这里尝试进一步介绍。即使与[any] IDE没有任何关联,也会出现sessionCreated(..)未被调用)问题。老实说,我认为清理项目(与之类似)与解决问题(即-Cookies)同时发生,与清理项目本身无关。

我遇到了同样的问题,解决了大约一个小时。

重要的提示和实际的问题是,您的浏览器可能已存储Cookies,它是从服务器在同一应用程序的先前运行时收到的,并且这些cookie不会被超时,杀死或销毁,因此不会使用.getSession(true)创建会话,因为每次发出请求时,您都会发送cookie。

如果在应用程序运行期间,您将打开dev-tools(或Chrome以外的其他浏览器中的相应实用程序)并清除cookie,然后然后重试以访问以下网址的URL servlet:创建会话,您将看到容器将调用sessionCreated方法,因为将创建新会话。