我有一个非常简单的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
下将其显示为监听器。
答案 0 :(得分:1)
原来这是一个愚蠢的Eclipse问题......
Project-> Clean ...并重新启动Tomcat就可以了。
答案 1 :(得分:0)
如果您不使用@WebListener,请确保在web.xml中引用了您的侦听器。
<web-app>...
<listener>
<listener-class>com.yoursite.YourSessionListener</listener-class>
</listener>
答案 2 :(得分:0)
好吧,我将在这里尝试进一步介绍。即使与[any] IDE没有任何关联,也会出现(sessionCreated(..)
未被调用)问题。老实说,我认为清理项目(与之类似)与解决问题(即-Cookies)同时发生,与清理项目本身无关。
我遇到了同样的问题,解决了大约一个小时。
重要的提示和实际的问题是,您的浏览器可能已存储Cookies
,它是从服务器在同一应用程序的先前运行时收到的,并且这些cookie不会被超时,杀死或销毁,因此不会使用.getSession(true)
创建会话,因为每次发出请求时,您都会发送cookie。
如果在应用程序运行期间,您将打开dev-tools(或Chrome以外的其他浏览器中的相应实用程序)并清除cookie,然后然后重试以访问以下网址的URL servlet:创建会话,您将看到容器将调用sessionCreated
方法,因为将创建新会话。