¿Cómo puedo usar un filtro de servlet para cambiar una url de solicitud de servlet entrante de
http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123
a
http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123
?
Actualización : de acuerdo con los pasos de BalusC a continuación, se me ocurrió el siguiente código:
public class UrlRewriteFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
//
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
String requestURI = request.getRequestURI();
if (requestURI.startsWith("/Check_License/Dir_My_App/")) {
String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1);
String newURI = requestURI.replace(toReplace, "?Contact_Id=");
req.getRequestDispatcher(newURI).forward(req, res);
} else {
chain.doFilter(req, res);
}
}
@Override
public void destroy() {
//
}
}
La entrada relevante en se web.xml
ve así:
<filter>
<filter-name>urlRewriteFilter</filter-name>
<filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>urlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Intenté la redirección del lado del servidor y del lado del cliente con los resultados esperados. Funcionó, gracias BalusC!
Respuestas:
javax.servlet.Filter
.doFilter()
método, emite el entranteServletRequest
aHttpServletRequest
.HttpServletRequest#getRequestURI()
para agarrar el camino.java.lang.String
métodos comosubstring()
,split()
,concat()
y así sucesivamente para extraer la parte de interés y componer la nueva ruta.ServletRequest#getRequestDispatcher()
y luegoRequestDispatcher#forward()
enviar la petición / respuesta a la nueva URL (redirección del lado del servidor, no se refleja en la barra de direcciones del navegador), o emitir el entranteServletResponse
aHttpServletResponse
y luegoHttpServletResponse#sendRedirect()
volver a dirigir la respuesta a la nueva URL (redirección del lado del cliente, que se refleja en barra de direcciones del navegador).web.xml
unaurl-pattern
de/*
o/Check_License/*
, dependiendo de la ruta de contexto, o si ya está en Servlet 3.0, use la@WebFilter
anotación para eso.No olvide agregar un cheque en el código si la URL necesita ser cambiada y si no , simplemente llame
FilterChain#doFilter()
, de lo contrario se llamará a sí mismo en un bucle infinito.Alternativamente, también puede usar una API de terceros existente para hacer todo el trabajo por usted, como UrlRewriteFilter de Tuckey, que se puede configurar de la misma manera que lo haría con Apache
mod_rewrite
.fuente
RequestDispatcher#forward()
se ejecuta, el resto de los filtros no se ejecutarán. Entonces, ¿no será una mejor manera que hacerlo como un servlet?<dispatcher>FORWARD</dispatcher>
al mapeo de filtro.<dispatcher>FORWARD</dispatcher>
al mapeo de filtro.Puede usar el filtro de reescritura de URL listo para usar con una regla como esta:
Consulte los ejemplos para más ... ejemplos.
fuente
Un simple filtro JSF Url Prettyfier basado en los pasos de la respuesta de BalusC . El filtro reenvía todas las solicitudes que comienzan con la ruta / ui (suponiendo que tenga todos sus archivos xhtml almacenados allí) a la misma ruta, pero agregando el sufijo xhtml.
fuente