HttpSessionListener.sessionCreated() 未被调用

HttpSessionListener.sessionCreated() not being called

我有一个非常简单的 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);

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

我不明白 - @WebListener 注释是否足以调用我的侦听器? Eclipse 甚至在 Deployment Descriptor/Listeners.

下将其显示为侦听器

原来这是那些愚蠢的 Eclipse 问题之一...

项目->清理...并重新启动 Tomcat 成功了。

如果您不使用@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.

好吧,我会尝试在这里更深入一点。这个问题 (sessionCreated(..) not being invoked) 即使与 [any] IDE 没有任何关联也可能发生。老实说,我认为清理项目(等)恰好与解决问题(即 - cookies)相吻合,与清理项目本身无关。

我 运行 遇到了同样的问题,并且解决了大约一个小时左右。

这里的重要线索和实际问题是您的浏览器可能已经存储了 Cookies 它在同一应用程序的先前运行时从服务器接收到的,并且这些 cookie 没有超时、终止或无论如何都被销毁了,因此,会话不会用 .getSession(true) 创建,因为每次发出请求时,都会发送 cookie。

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