filters example dofilter java url servlets request servlet-filters

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!


  1. Implementar javax.servlet.Filter .
  2. En el método doFilter() , ServletRequest el ServletRequest entrante a HttpServletRequest .
  3. Use HttpServletRequest#getRequestURI() para captar la ruta.
  4. Utilice métodos sencillos java.lang.String como substring() , split() , concat() y así sucesivamente para extraer la parte de interés y componer la nueva ruta.
  5. Utilice ServletRequest#getRequestDispatcher() y luego RequestDispatcher#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) o ServletResponse la ServletResponse entrante a HttpServletResponse y luego HttpServletResponse#sendRedirect() para redirigir la respuesta a la nueva URL (redirección del lado del cliente, reflejada en la barra de direcciones del navegador).
  6. Registre el filtro en web.xml en un url-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 { } }