example - filter java 8
¿Cómo usar un filtro de servlet en Java para cambiar una url de solicitud de servlet entrante? (4)
¿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 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>
Probé la redirección tanto del lado del servidor como del lado del cliente con los resultados esperados. Funcionó, gracias BalusC!
- Implementar
javax.servlet.Filter. - En el método
doFilter(),ServletRequestelServletRequestentrante aHttpServletRequest. - Use
HttpServletRequest#getRequestURI()para captar la ruta. - Utilice métodos sencillos
java.lang.Stringcomosubstring(),split(),concat()y así sucesivamente para extraer la parte de interés y componer la nueva ruta. - Utilice
ServletRequest#getRequestDispatcher()y luegoRequestDispatcher#forward()para reenviar la solicitud / respuesta a la nueva URL (redirección del lado del servidor, no reflejada en la barra de direcciones del navegador) oServletResponselaServletResponseentrante aHttpServletResponsey luegoHttpServletResponse#sendRedirect()para redirigir la respuesta a la nueva URL (redirección del lado del cliente, reflejada en la barra de direcciones del navegador). - Registre el filtro en
web.xmlen unurl-patternde/*o/Check_License/*, dependiendo de la ruta del contexto, o si ya está en Servlet 3.0, use la anotación@WebFilterpara eso.
No olvides agregar una marca en el código si la URL necesita ser modificada y si no , simplemente llama a FilterChain#doFilter() , de lo contrario se llamará a sí mismo en un bucle infinito.
Alternativamente, también puede utilizar una API de terceros para hacer todo el trabajo por usted, como UrlRewriteFilter de Tuckey, que se puede configurar de la manera que lo haría con mod_rewrite de Apache.
Puede usar el filtro de reescritura de URL listo para usar con una regla como esta:
<rule>
<from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from>
<to>/Check_License?Contact_Id=My_Obj_$1</to>
</rule>
Consulte los Examples para más ... ejemplos.
Tenga en cuenta que si su URL original contiene parámetros, es decir, http://nm-java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123 ? param1 = A & param2 = B , estos parámetros también se enviarán al siguiente servlet / jsp. No encontré la manera de deshacerme o reemplazar los parámetros originales (solo usando HttpServletRequestWrapper). ¿Algunas ideas?..
Actualización: parece que http://ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ soluciona este problema.
Un filtro JSF Url Prettyfier simple basado en los pasos de la respuesta de BalusC . El filtro envía todas las solicitudes comenzando con la ruta / ui (suponiendo que tienes todos tus archivos xhtml almacenados allí) en la misma ruta, pero agregando el sufijo xhtml.
public class UrlPrettyfierFilter implements Filter {
private static final String JSF_VIEW_ROOT_PATH = "/ui";
private static final String JSF_VIEW_SUFFIX = ".xhtml";
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
String requestURI = httpServletRequest.getRequestURI();
//Only process the paths starting with /ui, so as other requests get unprocessed.
//You can register the filter itself for /ui/* only, too
if (requestURI.startsWith(JSF_VIEW_ROOT_PATH)
&& !requestURI.contains(JSF_VIEW_SUFFIX)) {
request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX))
.forward(request,response);
} else {
chain.doFilter(httpServletRequest, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}