2012-09-29 22 views
5

cómo cambiar el requestURL utilizando filtro o servlet.cómo cambiar el requestURL utilizando el filtro o servlet

por ejemplo, si la petición es "http: // nombreservidor1: 8080" quiero cambiar lo mismo con "http: // servername2: 7001"

+0

Este enfoque no funciona. Afortunadamente este funciona muy bien http://stackoverflow.com/questions/2725102/how-to-use-a-servlet-filter-in-java-to-change-an-incoming-servlet-request-url –

Respuesta

13

Añadir la siguiente servlet filter a su aplicación:

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

Todas las solicitudes que desee interceptar deben pasar por ello. Como puede ver, toma el método original request y anula el método getRequestURL() al devolver un valor diferente. Aún tiene acceso a la solicitud original si desea basar una nueva URL en la anterior.

Al final debe continuar procesando la solicitud chain.doFilter() pero proporcionando la solicitud envuelta, no la original.

+0

en mi extremo Tengo este error: El constructor HttpServletRequestWrapper (ServletRequest) no está definido –

+0

Rabia, es posible que deba pasar HttpServletRequest al constructor del contenedor – inor

0

Lo anterior es una buena solución en comparación con muchos otros en la web que usan .forward() ya que rompe la cadena de filtros. Esta solución permite que los filtros posteriores procesen la solicitud después de que se haya modificado.

Pero hay 2 métodos adicionales que deben implementarse para que esto sea 'transparente' para el procesamiento de filtro descendente, y deben presentar la misma modificación de la URL para presentar un objeto de solicitud coherente. El contenedor debe implementar:

@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() 
} 
Cuestiones relacionadas