Spring MVC – Interceptor从未调用过

我试图在我的应用程序中配置拦截器,但我无法使其工作。

在我的应用程序配置类中,我已按以下方式配置:

@Configuration @EnableWebMvc public class AppContextConfiguration extends WebMvcConfigurerAdapter { ... @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()); } ... } 

和拦截器:

 public class MyInterceptor extends HandlerInterceptorAdapter{ private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.debug("MyInterceptor - PREHANDLE"); } } 

有谁知道为什么不被调用?

我正在使用Spring Boot并且遇到了同样的问题,其中addInterceptors()来注册拦截器,但拦截器在请求期间从未触发过。 然而,XML配置没有问题。

基本上,您不需要WebMvcConfigurerAdapter类。 你只需要声明一个@Bean类型的MappedInterceptor

 @Bean public MappedInterceptor myInterceptor() { return new MappedInterceptor(null, new MyInterceptor()); } 

必须在标记中的spring context xml配置文件中声明拦截器类。 是你做的吗?

来自文档

注册应用于所有URL路径的拦截器的示例:

    

注册限制于特定URL路径的拦截器的示例:

       

因此,您需要在spring context xml文件中配置MyInterceptor

如果它是可能的。 使用这种方法:

 public class Application extends WebMvcConfigurerAdapter{ ... @Bean public MyInterceptor myInterceptor() { return new MyInterceptor(); } public @Override void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor()); } } 

代替:

 @Bean public MappedInterceptor myInterceptor() { return new MappedInterceptor(null, new MyInterceptor()); } 

因为第一个你可以使用注射function(如@Autowired等…)

有人可以将Theos的答案标记为正确吗? 我有一个使用i18n和Thymeleaf(带布局拦截器)的完美工作Spring Boot应用程序的情况,只要该应用程序使用以下配置运行localhost:

 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); registry.addInterceptor(thymeleafLayoutInterceptor()); } 

一旦我将应用程序部署到Elasticbeanstalk实例,两个拦截器就不再被触发了。 虽然加了一次。 当我将设置更改为

 @Bean public MappedInterceptor localeInterceptor() { return new MappedInterceptor(null, localeChangeInterceptor()); } @Bean public MappedInterceptor thymeleafInterceptor() { return new MappedInterceptor(null, thymeleafLayoutInterceptor()); } 

一切都在所有环境中都运行良好。 使用addInterceptor添加触发拦截器一定存在问题,它可能取决于用于调用请求的URL – 我不知道。

谢谢你的回答,Theo,我只是想在这里添加这个,如果其他人偶然发现这个不错的function。