tags:

views:

68

answers:

2

I need to forward my request (to a jsp but I don't think it's matter) from an http.Filter if the URI of the original request pass some validation that my filter runs.

I found this page that faced similar task
http://mail-archives.apache.org/mod_mbox/tomcat-users/200111.mbox/%3C20011110161313.A24324-100000@localhost%3E

Still I need to figure the following:
1. How can I get ServletContext in doFilter() method (in order to call forward API) - getServletContext() is not recignized
2. Do I have to call chain.doFilter() before the forward, after the forward or not at all? In addition do I have to call chain.doFilter() if my validation passed or only if it fails (because in this case I won't continue to forward my page)?

This question actually continue this thread
to be more obvious, the code could be something like:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if (request instanceof HttpServletRequest) {
            HttpServletRequest httpServletRequest = ((HttpServletRequest)request);
            String requestURI = httpServletRequest.getRequestURI();
            String contextPath = httpServletRequest.getContextPath();
            if (<this is my implementation of the validation of this filter>){                                      
                getServletContext().getRequestDispatcher(
                "MySpecific.jsp").forward(request,response);

            }

        }
        chain.doFilter(request,response);

    }
A: 

How can I get ServletContext in doFilter() method?

httpServletRequest.getSession().getServletContext();

Do I have to call chain.doFilter() before the forward, after the forward or not at all? In addition do I have to call chain.doFilter() if my validation passed or only if it fails (because in this case I won't continue to forward my page)?

I would say that if you forwarded the request, you should not call chain.doFilter() - the forwarded request will get filtered according to its own filter configuration. If your validation failed though, it depends on what the semantics of your web app are - if the original page is some sort of general error/login/welcome screen, you may want to continue to that when the validation failed. It is hard to say without knowing more of the context.

Péter Török
A: 

To get the ServletContext, you've got 2 options:

  • Store off the FilterConfig during the initialization and call FilterConfig.getServletContext()
  • call HttpServletRequest.getSession().getServletContext()

I don't think you necessarily need the ServletContext to get the RequestDispatcher as you could just call HttpServletRequest.getRequestDispatcher().

In relation to FilterChain.doFilter() call, if you're forwarding, I would think you wouldn't make the call, as once you forward, I assume you don't want any of the standard behavior to take place. If you don't forward (you don't fall into your if block), then I'd call the FilterChain.doFilter() method, however that assumes there is a target on the other end to be invoked.

jridley
both answers were fine. The other one was first.
Spiderman