HttpSessionListener.sessionCreated() not being called

4.8k views Asked by At

I have a very simple Servlet and a very simple 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)  { 
    }

}

My HttpSessionListener.sessionCreated() method is never called (no log output), and I end up getting a NullPointerException on the line where I'm calling getSession()

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

I tried calling getSession() without true as well, but same problem.

I don't get it - isn't the @WebListener annotation enough to invoke my listener? Eclipse even displays it as a listener under Deployment Descriptor/Listeners.

4

There are 4 answers

0
Magnus On BEST ANSWER

Turns out it was one of those stupid Eclipse issues...

Project->Clean... and restarting Tomcat did the trick.

0
Prashant Thorat On

I was facing the same issue in spring boot application, where I had to remove session storage type as REDIS along with "spring-session-data-redis" maven dependancy. It seems that redis implementation of spring session doesn't trigger this event.

1
Giorgi Tsiklauri On

Well, I'll try to go a bit deeper here. This problem (sessionCreated(..) not being invoked) may occur even without any correlation with [any] IDE. To be honest, I think, that cleaning the project (and the like) just coincided with problem solving (which is - cookies) and it's not related to the cleaning of project per se.

I ran into same problem and was resolving for about an hour or so.

Important clue and the actual problem here is that your browser may have stored Cookies it received in the previous runtime of the same application from the server, and those cookies aren't timed-out, killed or destroyed anyhow, hence, session will not get created with .getSession(true) because every time you issue the request, you send cookie along.

If, during the runtime of the application, you'll open dev-tools (or respective utility in other browser than Chrome) and clear cookies, and then re-try to access URL servlet of which creates the session, you will see that container will invoke sessionCreated method, as new session will be created.

0
Philip Rego On

If you're not using @WebListener make sure your listeners are referenced in the 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.