SpringBoot注册Interceptor 拦截器问题

蔚落 2022-10-30 10:28 295阅读 0赞

问题场景

昨夜业界大佬给小编带来了内网穿透,于是小编兴致勃勃博的马上干了个SpringBoot 项目,来查看是否能进行正常访问,功夫不负有心人,还是业界大佬牛皮,让小编成功的能通过外网访问到内网的项目了。
过了一会小编就跟基友吹牛逼扯淡,把基友的照片放到小编的项目中 让基友群的基友们访问查看,这时小编突然想获取一下他们的IP 做一下记录,看一下PV 点击量,嘿嘿嘿。
小编的思路是在SpringBoot 中加入全局拦截器来做业务逻辑。
小编这时候突然想到了SpringBoot 中怎么该怎么注册Interceptor 到SpringMVC 中呢,于是小编各种百度,大致的结果都是这样的,通过实现WebMvcConfigurer 或者继承WebMvcConfigurationSupport 然后重写addInterceptors 方法来完成Integerceptor 的注册。
但是这种方式有很严重性的代码破坏

问题根源

如果实现了WebMvcConfigurer 或者继承了WebMvcConfigurationSupport 那么SpringBoot 中的自动配置类WebMvcAutoConfiguration 就没有存在而言了,这并不是开发团队想看到的,还有如果使用这种方式那跟不用SpringBoot 毫无区别。在这里插入图片描述
从这个类中可以看出,上面加有@ConditionalXxxx 系列注解,这类注解的作用是判断条件,其中最重要的就是@ConditionOnMissingBean 这个注解,如果Spring 加载过WebMvcConfigurationSupport 那么这个WebMvcAutoConfiguration 将不会被加载。

问题解决

根据小编对SpringFramework 和SpringMVC 的了解,对于注册Interceptor 是有扩展的,下面看一下小编的代码:

  1. @Order(Ordered.LOWEST_PRECEDENCE)
  2. public class InterceptorProcessor implements InstantiationAwareBeanPostProcessor {
  3. @Override
  4. public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
  5. if (bean instanceof AbstractHandlerMapping) {
  6. AbstractHandlerMapping handlerMapping = (AbstractHandlerMapping) bean;
  7. MappedInterceptor mappedInterceptor = new MappedInterceptor(new String[]{ "/**"}, new String[]{ }, new CustomHandlerInterceptor());
  8. handlerMapping.setInterceptors(mappedInterceptor);
  9. }
  10. return true;
  11. }
  12. }

对于上面的代码小编在这里不做任何描述,因为这里涉及到SpringFramewrok 和SpringMVC 的处理流程。
这里只是年轻的小编使用一种注册Interceptor 方式,如果当中存在代码冗余 或者代码缺陷,还望大佬指出,为年轻的小编上一课。

笔者留言

对于问题的解决方案还是是挺多的,送大家一句话 别向这个世界认输 因为你还有个牛逼的梦想
VX:ZhangchongSR0208

发表评论

表情:
评论列表 (有 0 条评论,295人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Interceptor拦截

    Interceptor(拦截器) 类似于Filter(过滤器),都是AOP思想的体现,能够实现日志,过滤等处理. 1.拦截器的实现:   方法一: