2012-03-28 12 views

Respuesta

64

desde la primavera de 3,2 añadieron que función con la etiqueta

mvc:exclude-mapping 

Ver este ejemplo a partir de la documentación de primavera:

<mvc:interceptors> 
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> 
<mvc:interceptor> 
    <mvc:mapping path="/**"/> 
    <mvc:exclude-mapping path="/admin/**"/> 
    <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor" /> 
</mvc:interceptor> 
<mvc:interceptor> 
    <mvc:mapping path="/secure/*"/> 
    <bean class="org.example.SecurityInterceptor" /> 
</mvc:interceptor> 

Aquí está la link a la doc

+0

¡Muchas gracias! ¡Lo probaré! – momomo

+2

Asegúrate de que el xsd apunte a 3.2. Pasé diez minutos tratando de descubrir qué está mal. xsi: schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd \t \t http: //www.springframework. org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd \t \t http://www.springframework.org/schema/mvc http: //www.springframework. org/schema/mvc/spring-mvc-3.2.xsd "> – RuntimeException

2

Al configurar un interceptor, puede especificar un patrón de ruta. El interceptor se invocará solo para los controladores cuya ruta coincida con el patrón de ruta del interceptor.

ref: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-config-interceptor

Pero como usted probablemente ha notado que, el patrón de ruta no es compatible con la exclusión.

Así que creo que la única forma es codificar una lista negra de rutas dentro del interceptor. Cuando se invoca el interceptor, recupere el HttpServletRequest.getRequestURI() y verifique si la ruta está en la lista negra o no.

Puede construir la lista negra dentro de un método anotado @PostConstruct del interceptor, y así obtener la ruta de acceso a la lista negra de un archivo de propiedad, por ejemplo.

+0

Sí, la pregunta es ¿cuál sería la forma correcta para determinar el controlador y la acción ya que las asignaciones de controlador en teoría se puede construir de varias maneras ... primavera sabe lo que el controlador es para ser disparado después de la interceptor, ya que el objeto controlador es la instancia del controlador. Para hacer esto correctamente uno debería buscarlo usando el mismo mecanismo que la primavera para determinar la acción objetivo ... ¿alguien? :) – momomo

+0

El mecanismo utilizado por Spring para determinar el controlador correcto se basa en la anotación '@ RequestMapping'. Entonces, tener lo mismo para los interceptores significa básicamente anotar un interceptor con '@ RequestMapping'. Pero esto no es posible actualmente. – tbruyelle

14

Para la configuración basada en Java, desde el docs

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(new LocaleInterceptor()); 
     registry.addInterceptor(new ThemeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**"); 
     registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*"); 
    } 

} 
Cuestiones relacionadas