在应用中添加了一个拦截器,实现了HandlerInterceptor类,然后创建一个类继承WebMvcConfigurer,重写WebMvcConfigurer的addInterceptors方法,将拦截器添加进去,规则为" /** ",发现请求畅通无阻,拦截器无效。经过反复测试,发现去掉应用跨域的配置则拦截正常,跨域配置继承了WebMvcConfigurationSupport类。
spring中配置WebMvc,一是继承WebMvcConfigurationSupport,二是继承WebMvcConfigurer的子抽象类WebMvcConfigurerAdapter(WebMvcConfigurerAdapter在springboot2中被标记为过时,改为实现WebMvcConfigurer接口类的方式),另外可以看到WebMvcConfigurationSupport中的子类可以重写的空方法在WebMvcConfigurer都存在,WebMvcConfigurer只是WebMvcConfigurationSupport的一个扩展类,并无新功能。
download源码,找到WebMvcConfigurationSupport类,在方法requestMappingHandlerMapping中加断点,然后启动应用,启动过程中初始化容器,断点执行到这里,发现没有我自定义的拦截器信息(MappedInterceptor),说明拦截器添加没有成功。
image.png
我们可以看下getInterceptors这个方法:
image.png
其中addInterceptors方法需要继承的子类重写该方法,添加自定义拦截器,跨域配置中,继承了WebMvcConfigurationSupport但是并没有重写addInterceptors方法。
在看WebMvcConfigurer类,它是一个接口类,DelegatingWebMvcConfiguration.addInterceptors()调用了WebMvcConfigurer.addInterceptors(),DelegatingWebMvcConfiguration继承自WebMvcConfigurationSupport,DelegatingWebMvcConfiguration.addInterceptors()其实是重写了WebMvcConfigurationSupport中的addInterceptors
image.png
所以注册拦截器时,通过implements WebMvcConfigurer的类对addInterceptors方法重写,完全可以放到继承于WebMvcConfigurationSupport的类中来实现对addInterceptors的重写。
再次断点测试:
image.png
可以看到拦截器注册成功。
网友评论