美文网首页
Spring boot2拦截器失效原因探究及解决

Spring boot2拦截器失效原因探究及解决

作者: howtor | 来源:发表于2019-08-29 17:30 被阅读0次

    在应用中添加了一个拦截器,实现了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

    可以看到拦截器注册成功。

    相关文章

      网友评论

          本文标题:Spring boot2拦截器失效原因探究及解决

          本文链接:https://www.haomeiwen.com/subject/jcgiectx.html