SpringBoot注册Interceptor 拦截器问题
问题场景
昨夜业界大佬给小编带来了内网穿透,于是小编兴致勃勃博的马上干了个SpringBoot 项目,来查看是否能进行正常访问,功夫不负有心人,还是业界大佬牛皮,让小编成功的能通过外网访问到内网的项目了。
过了一会小编就跟基友吹牛逼扯淡,把基友的照片放到小编的项目中 让基友群的基友们访问查看,这时小编突然想获取一下他们的IP 做一下记录,看一下PV 点击量,嘿嘿嘿。
小编的思路是在SpringBoot 中加入全局拦截器来做业务逻辑。
小编这时候突然想到了SpringBoot 中怎么该怎么注册Interceptor 到SpringMVC 中呢,于是小编各种百度,大致的结果都是这样的,通过实现WebMvcConfigurer
或者继承WebMvcConfigurationSupport
然后重写addInterceptors
方法来完成Integerceptor 的注册。
但是这种方式有很严重性的代码破坏
问题根源
如果实现了WebMvcConfigurer
或者继承了WebMvcConfigurationSupport
那么SpringBoot 中的自动配置类WebMvcAutoConfiguration
就没有存在而言了,这并不是开发团队想看到的,还有如果使用这种方式那跟不用SpringBoot 毫无区别。
从这个类中可以看出,上面加有@ConditionalXxxx
系列注解,这类注解的作用是判断条件,其中最重要的就是@ConditionOnMissingBean
这个注解,如果Spring 加载过WebMvcConfigurationSupport
那么这个WebMvcAutoConfiguration
将不会被加载。
问题解决
根据小编对SpringFramework 和SpringMVC 的了解,对于注册Interceptor 是有扩展的,下面看一下小编的代码:
@Order(Ordered.LOWEST_PRECEDENCE)
public class InterceptorProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if (bean instanceof AbstractHandlerMapping) {
AbstractHandlerMapping handlerMapping = (AbstractHandlerMapping) bean;
MappedInterceptor mappedInterceptor = new MappedInterceptor(new String[]{ "/**"}, new String[]{ }, new CustomHandlerInterceptor());
handlerMapping.setInterceptors(mappedInterceptor);
}
return true;
}
}
对于上面的代码小编在这里不做任何描述,因为这里涉及到SpringFramewrok 和SpringMVC 的处理流程。
这里只是年轻的小编使用一种注册Interceptor 方式,如果当中存在代码冗余 或者代码缺陷,还望大佬指出,为年轻的小编上一课。
笔者留言
对于问题的解决方案还是是挺多的,送大家一句话 别向这个世界认输 因为你还有个牛逼的梦想。
还没有评论,来说两句吧...