2010-08-05 1 views
13

ho bisogno di avanti la mia richiesta (ad una jsp, ma non credo che sia la materia) da un http.Filter se l'URI della richiesta originale passare un po 'di convalida che il mio filtro piste.richiesta avanti da un filtro

ho trovato questo page that faced similar task

Ancora ho bisogno di capire quanto segue:

  1. Come posso ottenere ServletContext a doFilter() metodo (per chiamare avanti API) getServletContext() non è recignized

  2. Devo call chain.doFilter() prima dell'avanzamento, dopo l'inoltro o non del tutto? Inoltre devo chiamare chain.doFilter() se la mia convalida è passata o solo se fallisce (perché in questo caso non continuerò ad inoltrare la mia pagina)?

Questa domanda in realtà continuano this thread, per essere più evidente, il codice potrebbe essere qualcosa del tipo:

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

    } 

risposta

10

Come posso ottenere ServletContext a doFilter() metodo?

httpServletRequest.getSession().getServletContext(); 

Devo chiamare chain.doFilter() prima in avanti, dopo l'attaccante o per niente? Inoltre devo chiamare chain.doFilter() se la mia convalida è passata o solo se fallisce (perché in questo caso non continuerò ad inoltrare la mia pagina)?

Direi che se hai inoltrato la richiesta, non dovresti chiamare chain.doFilter() - la richiesta inoltrata verrà filtrata in base alla propria configurazione del filtro. Se la validazione non è riuscita, dipende da che cosa è la semantica della tua app web - se la pagina originale è una sorta di errore generale/login/schermata di benvenuto, puoi continuare a farlo quando la convalida fallisce. È difficile dire senza conoscere più del contesto.

10

Per ottenere ServletContext, hai 2 opzioni:

  • Conservare al largo della FilterConfig durante l'inizializzazione e chiamare FilterConfig.getServletContext()

  • chiamata HttpServletRequest.getSession().getServletContext()

I don' Penso che sia necessario il ServletContext per ottenere il RequestDispatcher come si potrebbe semplicemente chiamare HttpServletRequest.getRequestDispatcher().

In relazione alla chiamata FilterChain.doFilter(), se si sta inoltrando, penserei che non si effettuerà la chiamata, poiché una volta che si inoltra, presumo che non si desideri eseguire alcuno dei comportamenti standard. Se non inoltrate (non cadete nel vostro blocco if), allora chiamerei il metodo FilterChain.doFilter(), tuttavia supponiamo che ci sia un bersaglio all'altro capo da invocare.

+0

entrambe le risposte andavano bene. L'altro era il primo. – Spiderman

+0

Memorizza FilterConfig durante l'inizializzazione e chiama FilterConfig.getServletContext() Questo è il mio metodo preferito in quanto non ha una sessione esplicita: – Gurnard