2012-09-29 8 views
5

come cambiare il requestURL usando il filtro o il servlet.come cambiare il requestURL usando il filtro o servlet

per esempio se la richiesta è "http: // nomeserver1: 8080" voglio cambiare lo stesso a "http: // servername2: 7001"

+0

Questo approccio non funziona. Fortunatamente questo funziona alla grande http://stackoverflow.com/questions/2725102/how-to-use-a-servlet-filter-in-java-to-change-an-incoming-servlet-request-url –

risposta

13

Aggiungere il seguente servlet filter alla vostra applicazione:

public class RequestUrlRewritingFilter implements Filter { 

    //Empty init()/destroy() here 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     final HttpServletRequestWrapper wrapped = new HttpServletRequestWrapper(request) { 
      @Override 
      public StringBuffer getRequestURL() { 
       final StringBuffer originalUrl = ((HttpServletRequest) getRequest()).getRequestURL(); 
       return new StringBuffer("http://servername2:7001"); 
      } 
     }; 
     chain.doFilter(wrapped, response); 
    } 
} 

Tutte le richieste che si desidera intercettare devono passare attraverso di essa. Come puoi vedere, prende il metodo originale request e sostituisce il metodo getRequestURL() restituendo un valore diverso. Hai ancora accesso alla richiesta originale se desideri basare il nuovo URL su quello precedente.

Alla fine è necessario continuare l'elaborazione della richiesta chain.doFilter() ma fornendo una richiesta spostata, non quella originale.

+0

alla mia estremità Sto avendo questo errore: Il costruttore HttpServletRequestWrapper (ServletRequest) non è definito –

+0

Rabia, potrebbe essere necessario passare HttpServletRequest al costruttore wrapper – inor

0

Quanto sopra è una buona soluzione rispetto a molti altri sul Web che utilizzano .forward() come quello che interrompe la catena di filtri. Questa soluzione consente ai filtri successivi di elaborare la richiesta dopo che è stata modificata.

Ma ci sono 2 metodi aggiuntivi che devono essere implementati affinché questo sia "trasparente" per l'elaborazione del filtro downstream e devono presentare la stessa modifica dell'URL per presentare un oggetto di richiesta coerente. Il wrapper deve implementare:

@Override 
public String getRequestURI() { 
    final String originalUri = ((HttpServletRequest)getRequest()).getRequestURI(); 
    return "/"; // Must be consistent with getRequestURL() 
} 
@Override 
public String getServletPath() { 
    final String originalPath = ((HttpServletRequest)getRequest()).getServletPath(); 
    return "/"; // Must be consistent with getRequestURL() 
} 
Problemi correlati