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()
,ServletRequest
elServletRequest
entrante aHttpServletRequest
. - Use
HttpServletRequest#getRequestURI()
para captar la ruta. - Utilice métodos sencillos
java.lang.String
comosubstring()
,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) oServletResponse
laServletResponse
entrante aHttpServletResponse
y 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.xml
en unurl-pattern
de/*
o/Check_License/*
, dependiendo de la ruta del contexto, o si ya está en Servlet 3.0, use la anotación@WebFilter
para 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 {
}
}