2010-04-27 46 views
154

¿Cómo puedo utilizar un filtro de servlet para cambiar una petición de servlet URL entrante desde¿Cómo utilizar un filtro de servlet en Java para cambiar una url de solicitud de servlet entrante?

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 a los pasos de BalusC abajo, 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 correspondiente en web.xml tener este aspecto:

<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é tanto el lado del servidor como el lado del cliente redirigen con los resultados esperados. Funcionó, gracias BalusC!

+0

pregunta relacionada: http://stackoverflow.com/questions/2723829/how-to-catch-non-exist-requested-url-in-java-servlet – BalusC

+0

¿Qué versión de la especificación servlet está usando ? Cómo envías solicitudes de cambios con las diferentes versiones. –

+0

[Ver esta publicación] (http://stackoverflow.com/questions/2283237/most-useful-java-servlet-filter-out-there) también tiene un filtro que hace lo que quiere –

Respuesta

242
  1. Implemento javax.servlet.Filter.
  2. En el método doFilter(), envíe el ServletRequest entrante al HttpServletRequest.
  3. Usa HttpServletRequest#getRequestURI() para tomar el camino.
  4. Use java.lang.String métodos simples como substring(), split(), concat() y así sucesivamente para extraer la parte de interés y componer la nueva ruta.
  5. uso ya sea ServletRequest#getRequestDispatcher() y luego RequestDispatcher#forward() para reenviar la solicitud/respuesta a la nueva dirección URL (redirección del lado del servidor, no se refleja en la barra de direcciones del navegador), o tire la entrada ServletResponse 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 una url-pattern de /* o /Check_License/*, dependiendo de la ruta de contexto, o si se encuentra en Servlet 3.0 ya, utilice la anotación @WebFilter para que en su lugar.

No se olvide de añadir un cheque en el código si la URL necesita ser cambiado y si no , a continuación, sólo llaman FilterChain#doFilter(), de lo contrario se llame a sí mismo en un bucle infinito.

También puede utilizar una API de terceros para hacer todo el trabajo por usted, como Tuckey's UrlRewriteFilter que se puede configurar de la manera que lo haría con Apache mod_rewrite.

+1

Cualquier código de muestra doFilter() en algún lugar que hace lo anterior? Gracias. – Frank

+18

¿En qué paso exactamente estás metiendo? Mi respuesta casi escribe el código en sí. ¿También notó que las referencias de código en azul son en realidad enlaces a Javadocs que describe el comportamiento de clase/método en detalle? En cualquier caso, puede encontrar [aquí] (http://courses.coreservlets.com/Course-Materials/csajsp2.html) y [aquí] (http://courses.coreservlets.com/Course-Materials/msajsp. html) buenos tutoriales de JSP/Servlet, específicamente [esto] (http://courses.coreservlets.com/Course-Materials/pdf/msajsp/05-Filters.pdf) uno sobre los filtros. – BalusC

+0

Seguí lo mismo para implementar el filtro pero no tuve éxito. Por favor ayuda. La solicitud no está redirigiendo a la clase de recurso de destino para el servicio. –

16

podría utilizar la lista para su uso Url Rewrite Filter con una regla como ésta:

<rule> 
    <from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from> 
    <to>/Check_License?Contact_Id=My_Obj_$1</to> 
</rule> 

Compruebe el Examples para más ejemplos ....

1

Tenga en cuenta que si su URL original contiene parámetros, es decirhttp://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). ¿Alguna idea? ...

Actualización: parece que http://ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ soluciona este problema.

+7

Las respuestas no están destinadas a hacer preguntas. – Mot

2

Un filtro JSF Url Prettyfier simple basado en los pasos de BalusC's answer. 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 { 

    } 

} 
Cuestiones relacionadas