doFilter called twice, intended behaviour?

user1348661 picture user1348661 · May 20, 2013 · Viewed 12.2k times · Source

I'm working through the Java EE servlet tutorial and tried the mood example. I noticed the doFilter is getting called twice, once the servlet call is in the chain and the second time it isnt.

I added some printlns in the TimeOfDayFilter.java and in the MoodServlet.java to show this.

TimeOfDayFilter.java:

    ...
    System.out.println("TimeOfDay before"); //added
    chain.doFilter(req, res);
    System.out.println("TimeOfDay after"); //added
    ...

MoodServlet.java:

    ...
    response.setContentType("text/html;charset=UTF-8");

    System.out.println("MoodServlet"); //added

    PrintWriter out = response.getWriter();
    ...

The result from the glassfish server (3.1) window when calling the servlet is the following:

    INFO: mood was successfully deployed in 406 milliseconds.
    INFO: TimeOfDay before
    INFO: MoodServlet
    INFO: TimeOfDay after
    INFO: TimeOfDay before
    INFO: TimeOfDay after

Is this intended behaviour? If so, what is the reason for the extra call?

Answer

Rajarshee Mitra picture Rajarshee Mitra · Apr 2, 2015
chain.doFilter(request,response);

This will pass the control to the servlet the filter is associated with. But after the corresponding servlet is executed, the control comes back at the end of the above line and all the lines thereafter in the current doFilter() is executed.

If you want to pass the control permanently to the servlet and not letting it return to the filter, just add a

return;

at the end of chain.doFilter(request,response) line in the current filter.