2010-08-05 19 views
13

Necesito reenviar mi solicitud (a un jsp pero no creo que sea el asunto) de un http.Filter si el URI de la solicitud original pasa alguna validación que ejecuta mi filtro.Reenviar solicitud de un filtro

yo encontramos este page that faced similar task

Todavía tiene que averiguar lo siguiente:

  1. ¿Cómo puedo obtener ServletContext en doFilter() método (con el fin de desvío de llamada API) getServletContext() no se recignized

  2. ¿Tengo que call chain.doFilter() antes del delantero, después del delantero o no? Además, ¿tengo que llamar al chain.doFilter() si mi validación pasó o solo si falla (porque en este caso no continuaré reenviando mi página)?

Esta pregunta en realidad siguen this thread, a ser más obvio, el código podría ser algo como:

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); 

    } 

Respuesta

10

¿Cómo puede método() Puedo obtener ServletContext en doFilter?

httpServletRequest.getSession().getServletContext(); 

¿Tengo que llamar chain.doFilter() antes de que el futuro, después de que el avance o no en absoluto? Además, ¿tengo que llamar a chain.doFilter() si mi validación pasó o solo si falla (porque en este caso no continuaré reenviando mi página)?

Yo diría que si reenvió la solicitud, no debe llamar al chain.doFilter() - la solicitud reenviada se filtrará según su propia configuración de filtro. Sin embargo, si falla su validación, depende de la semántica de su aplicación web: si la página original es una especie de pantalla de error/inicio de sesión/bienvenida general, puede continuar cuando la validación falla. Es difícil de decir sin conocer más el contexto.

10

Para obtener el ServletContext, tienes 2 opciones:

  • tiendas frente a la FilterConfig durante la inicialización y llaman FilterConfig.getServletContext()

  • llamada HttpServletRequest.getSession().getServletContext()

I don' Creo que necesitas necesariamente el ServletContext para obtener el RequestDispatcher como podría llamar al HttpServletRequest.getRequestDispatcher().

En relación con la llamada FilterChain.doFilter(), si está reenviando, creo que no haría la llamada, ya que una vez que reenvía, supongo que no desea que tenga lugar el comportamiento estándar. Si no reenvías (no caes en tu bloque if), entonces llamaría al método FilterChain.doFilter(), pero eso supone que hay un objetivo en el otro extremo que se invocará.

+0

ambas respuestas estaban bien. El otro fue el primero. – Spiderman

+0

Almacene el FilterConfig durante la inicialización y llame a FilterConfig.getServletContext() Este es mi método preferido ya que no tengo una sesión explícitamente: – Gurnard

Cuestiones relacionadas