在黑马商城微服务中,网关里的过滤器给Http请求加上了用户信息的请求头,发往后端服务,后端服务使用拦截器进行拦截,并取出用户信息,添加到ThreadLocal中。
使用拦截器获取用户信息的好处是不用在每个业务中写获取信息的代码,减少冗余。
黑马商城的每个微服务都引用了hm-common依赖,所以我们把拦截器定义在hm-common中。
下面是网关中过滤器的代码:
然后是拦截器:
拦截器要想生效,我们需要为拦截器写个配置类:
但此时拦截器并未生效。因为我们的服务与拦截器不在同一个包中,我们的服务扫描不到hm-common包,所以这时候我们要在resouces.META-INF.spring.factories中添加配置类所在的完整包名。
这样我们可以进行跨包扫描了,但此时还有个问题,我们重启网关服务之后报错:
“找不到WebMvcConfigurer.class这个类“,我们知道WebMvcConfigurer.class是属于SpringMvc的,但是我们的网关服务并不是基于SpringMvc的,网关服务并没有springmvc,但是网关的common依赖引用了SpringMVC的功能,所以我们需要开启SpringBoot装配的条件注解,判断一个类是否存在:
这样基于SpringMVC的服务有DispatcherServlet.class,那么这个配置类就生效,否则不生效。
这样我们就可以在业务代码中取到ThreadLocal中的值了。
但是我遇到了一个问题:
ThreadLocal取到的为null。
经过调试,发现在拦截器中并没有注入进ThreadLocal,原来是修改hm-common之后没有进行编译,重新编译hm-common,通过。