2014-11-21 2 views
5

В следующей настройке перехватчик TimingInterceptor и CORSHeaders выполняется во всех запросах URL-адресов, за исключением URL-адресов/resources/**. Как заставить перехватчики работать для/resources/** URL-адресов, обслуживаемых ResourceHttpRequestHandler?Spring MVC Interceptor не выполняет для URL-адреса обработчика ресурсов

@EnableWebMvc //equivalent to mvc:annotation-driven 
@Configuration 
@PropertySource("classpath:configuration.properties") 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Inject 
    private TimingInterceptor timingInterceptor; 

    @Inject 
    private CORSHeaders corsHeaders; 

    // equivalent to mvc:resources 
    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 

    } 

    // equivalent to mvc:interceptors 
    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(timingInterceptor).addPathPatterns("/**"); 
     registry.addInterceptor(corsHeaders).addPathPatterns("/**"); 
    } 

} 

ответ

2

Обновление: По Spring Framework 5.0.1 (и SPR-16034), перехватчики автоматически отображаются на ResourceHttpRequestHandler по умолчанию.

Я думаю, что сконфигурированные перехватчики не отображаются на обработчике ресурсов, а на одном обращении @RequestMapping.

Возможно, попробуйте это вместо этого?

@EnableWebMvc //equivalent to mvc:annotation-driven 
@Configuration 
@PropertySource("classpath:configuration.properties") 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Inject 
    private TimingInterceptor timingInterceptor; 

    @Inject 
    private CORSHeaders corsHeaders; 

    // equivalent to mvc:resources 
    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 

    } 

    @Bean 
    public MappedInterceptor timingInterceptor() { 
     return new MappedInterceptor(new String[] { "/**" }, timingInterceptor); 
    } 

    @Bean 
    public MappedInterceptor corsHeaders() { 
     return new MappedInterceptor(new String[] { "/**" }, corsHeaders); 
    } 

} 

Это должно быть лучше документированы с SPR-10655.

+0

Да, я думаю, вы правы. Я попробовал добавить MappedInterceptor, как вы уже сказали, но метод не вызывается, и перехватчик не добавляется в контекст. – tukushan

+1

Я создал простой пример для этого: https://github.com/spring-projects/spring-framework-issues/tree/master/SPR-10655 - можете ли вы взглянуть на него? Если вы придумали репродублированный проект с возможной ошибкой, просто откройте JIRA-проблему на http://jira.spring.io –

+0

@BrianClozel использует '@ EnableWebMvc' и' WebMvcConfigurerAdapter' вместе рекомендуемые? В [документе] (http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-spring-mvc-auto-configuration) говорится об обратном. Или я чего-то не хватает? –

0

Я никогда не пытался использовать весенние перехватчики для обслуживания ресурсов. Мощность перехватчиков должна иметь крючок перед контроллером и между контроллером и видом.

Чтобы добавить до или после обработки ресурсов, лучше использовать фильтры.

Смежные вопросы