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>
好吧,我会尝试在这里更深入一点。这个问题 (sessionCreated(..)
not being invoked) 即使与 [any] IDE 没有任何关联也可能发生。老实说,我认为清理项目(等)恰好与解决问题(即 - cookies)相吻合,与清理项目本身无关。
我 运行 遇到了同样的问题,并且解决了大约一个小时左右。
这里的重要线索和实际问题是您的浏览器可能已经存储了 Cookies
它在同一应用程序的先前运行时从服务器接收到的,并且这些 cookie 没有超时、终止或无论如何都被销毁了,因此,会话不会用 .getSession(true)
创建,因为每次发出请求时,都会发送 cookie。
如果在应用程序运行期间打开开发工具(或 Chrome 以外的其他浏览器中的相应实用程序)并清除 cookie,然后然后 重新尝试访问创建会话的 URL servlet,您将看到容器将调用 sessionCreated
方法,因为将创建新会话。
我有一个非常简单的 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>
好吧,我会尝试在这里更深入一点。这个问题 (sessionCreated(..)
not being invoked) 即使与 [any] IDE 没有任何关联也可能发生。老实说,我认为清理项目(等)恰好与解决问题(即 - cookies)相吻合,与清理项目本身无关。
我 运行 遇到了同样的问题,并且解决了大约一个小时左右。
这里的重要线索和实际问题是您的浏览器可能已经存储了 Cookies
它在同一应用程序的先前运行时从服务器接收到的,并且这些 cookie 没有超时、终止或无论如何都被销毁了,因此,会话不会用 .getSession(true)
创建,因为每次发出请求时,都会发送 cookie。
如果在应用程序运行期间打开开发工具(或 Chrome 以外的其他浏览器中的相应实用程序)并清除 cookie,然后然后 重新尝试访问创建会话的 URL servlet,您将看到容器将调用 sessionCreated
方法,因为将创建新会话。