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"
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"
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.
en mi extremo Tengo este error: El constructor HttpServletRequestWrapper (ServletRequest) no está definido –
Rabia, es posible que deba pasar HttpServletRequest al constructor del contenedor – inor
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()
}
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 –