2011-12-20 42 views
29

Estoy escribiendo un filtro para realizar una tarea específica, pero no puedo establecer un patrón de URL específico para mi filtro. Mi asignación del filtro es la siguiente:¿Podemos usar expresiones regulares en patrones de URL web.xml?

<web.xml> 
    <filter> 
    <filter-name>myFilter</filter-name> 
    <filter-class>test.MyFilter</filter-class> 
    </filter> 

    <filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/org/test/*/keys/*</url-pattern> 
    </filter-mapping> 
</web-app> 

mi url-pattern [ /org/test/ * /keys/ * ] no funciona como esperaba.

Estoy llamando a las direcciones URL desde el navegador como:

http://localhost:8080/myapp/org/test/SuperAdminReport/keys/superAdminReport.jsp 
http://localhost:8080/myapp/org/test/Adminreport/keys/adminReport.jsp 
http://localhost:8080/myapp/org/test/OtherReport/keys/otherReport.jsp 

Así que para las URL anteriores el patrón del filtro deben coincidir. ¿Cómo puedo conseguir esto?

+3

Por lo que yo sé, solo puede usar los contenidos de una carpeta en particular ('ruta/a/mi/carpeta/*') o una extensión particular ('* .do') en el urlpattern. – bdares

+0

Consulte la respuesta aceptada en [esta pregunta] (http://stackoverflow.com/q/26732/922954) – aishwarya

Respuesta

6

Su URL no funcionará ya que no es un patrón de URL válido. Se puede hacer referencia a la siguiente respuesta

URL spec

0

en web.xml para el mapeo de servlets, se puede aplicar comodín sólo al start o la end, si se intenta aplicar el comodín en el medio no será recogido el mapeo.

3

Eso no funcionará, no se puede usar regex allí. Trate de usar esta URL de su aplicación:

http://localhost:8080/myapp/org/test/keys/SuperAdminReport/superAdminReport.jsp 
http://localhost:8080/myapp/org/test/keys/Adminreport/adminReport.jsp 
http://localhost:8080/myapp/org/test/keys/OtherReport/otherReport.jsp 

Y esta configuración para su web.xml:

<filter-mapping> 
    <filter-name>myFilter</filter-name> 
    <url-pattern>/org/test/keys/*</url-pattern> 
</filter-mapping> 
35

No, usted no puede utilizar una expresión regular allí. De acuerdo con la versión 2.4 de Java Servlet Specification (sección srv.11.1), el rutaDeAccesoUrl se interpreta de la siguiente manera:

  • Una cadena que comienza con un carácter '/' y termina con un '/ *' sufijo se utiliza para mapeo de ruta.
  • Una cadena que comienza con el prefijo '*.' Se usa como una asignación de extensión.
  • Una cadena que contiene solo el carácter '/' indica el servlet "predeterminado" de la aplicación. En este caso, la ruta del servlet es el URI de solicitud menos la ruta de acceso y la información de ruta es nula.
  • Todas las demás cadenas se usan solo para coincidencias exactas.

No está permitido regexes. Ni siquiera complicadas cartas salvajes.

0

Las respuestas anteriores son correctas, ya que un patrón de url solo puede comenzar o terminar con un carácter comodín, y por lo tanto no se puede usar el verdadero poder de la expresión regular.

Sin embargo, he resuelto este problema en proyectos anteriores creando un filtro predeterminado simple que intercepta todas las solicitudes y el filtro contiene expresiones regulares para determinar si se debe aplicar una lógica adicional. Descubrí que hubo poca o ninguna degradación del rendimiento con este enfoque.

A continuación se muestra un ejemplo simple que podría mejorarse moviendo el patrón de expresiones regulares a un atributo de filtro.

Configuración del filtro dentro de la web.xml:

<filter> 
    <filter-name>SampleFilter</filter-name> 
    <filter-class>org.test.SampleFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SampleFilter</filter-name> 
    <servlet-name>SampleServlet</servlet-name> 
</filter-mapping> 
<servlet-mapping> 
    <servlet-name>SampleServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

aplicación del filtro básico que podría utilizar cualquier patrón de expresión (lo siento, usos clase padre OncePerRequestFilter de primavera):

public class SampleFilter extends OncePerRequestFilter { 

    @Override 
    final protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
     if (applyLogic(request)) { 
      //Execute desired logic; 
     } 

     filterChain.doFilter(request, response); 
    } 

    protected boolean applyLogic(HttpServletRequest request) { 
     String path = StringUtils.removeStart(request.getRequestURI(), request.getContextPath()); 

     return PatternMatchUtils.simpleMatch(new String[] { "/login" }, path); 
    } 
} 
8

Como han dicho otros, no hay manera de filtrar con expresiones regulares usando solo las características básicas del filtro de servlets. Es probable que la especificación del servlet esté escrita de la forma en que permite una correspondencia eficiente de las URL, y porque los servlets son anteriores a la disponibilidad de las expresiones regulares en Java (las expresiones regulares llegaron a Java 1.4).

Las expresiones regulares serían probablemente menos eficiente (no, yo no he referenciado), pero si no está fuertemente limitado por el tiempo de procesamiento y el deseo de los resultados del comercio para facilitar la configuración que pueden hacerlo de esta manera:

en su filtro:

private String subPathFilter = ".*"; 
private Pattern pattern; 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    String subPathFilter = filterConfig.getInitParameter("subPathFilter"); 
    if (subPathFilter != null) { 
     this.subPathFilter = subPathFilter; 
    } 
    pattern = Pattern.compile(this.subPathFilter); 
    } 

    public static String getFullURL(HttpServletRequest request) { 
    // Implement this if you want to match query parameters, otherwise 
    // servletRequest.getRequestURI() or servletRequest.getRequestURL 
    // should be good enough. Also you may want to handle URL decoding here. 
    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    Matcher m = pattern.matcher(getFullURL((HttpServletRequest) servletRequest)); 
    if (m.matches()) { 

     // filter stuff here. 

    } 
    } 

Luego, en web.xml ...

<filter> 
    <filter-name>MyFiltersName</filter-name> 
    <filter-class>com.konadsc.servlet.MyFilter</filter-class> 
    <init-param> 
     <param-name>subPathFilter</param-name> 
     <param-value>/org/test/[^/]+/keys/.*</param-value> 
    </init-param> 
    </filter> 
    <filter-mapping> 
    <filter-name>MyFiltersName</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Es también a veces conveniente para hacer el modelo excluye el partido invirtiendo la sentencia if en doFilter() (o añadir otro parámetro de inicialización de patrones excluye, que se deja como ejercicio para el lector.)

Cuestiones relacionadas