微服务中引入公共拦截器
本文使用的微服务版本为springcloudAlbaba :2021.0.4.0
微服务工程,一般公共的东西都放入一个工程,别的微服务都会引入这个工程,比如common-service,那么就可以在这个工程编写一个拦截器:,比如:
public class UserInfoInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //从请求头中获取用户信息 String header = request.getHeader("user-info"); if(StrUtil.isNotBlank(header)){ //这里UserContext的user是个ThreadLocal UserContext.setUser(Long.valueOf(header)); } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { UserContext.removeUser(); } }
这里是做个用户信息获取的拦截器,从请求头中获取用户信息,然后塞入ThreadLocal中,供后续业务使用。
定义完了,为了使它生效,编译一个配置类:
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration public class MvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new UserInfoInterceptor()); } }
然后利用springboot自动装配的原理,在spring.factroies中添加MvcConfig的全路径,
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.*.common.config.MvcConfig
这里*用你实际的就好,别真的写*。
这样所有引入common-service依赖的微服务都添加了这个拦截器。
但是注意如果某个微服务启动报错,可能是你的某这个微服务没有引入springmvc的依赖,比如网关微服务,网关不需要springmvc的依赖,也不需要这个拦截器,
我们同样利用springboot自动装配ConditionalOnClass注解的特性来让网关不引入这个拦截器。只需要加上一段@ConditionalOnClass(DispatcherServlet.class)即可
@Configuration @ConditionalOnClass(DispatcherServlet.class) public class MvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new UserInfoInterceptor()); } }
DispatcherServlet是springmvc的核心类,使用ConditionalOnClass,即判断当前有没有引入springmvc的依赖来判断是否引入MvcConfig 这个配置类,网关没有springmvc的依赖,这样这个配置类就不会生效。
(图片来源网络,侵删)
(图片来源网络,侵删)
(图片来源网络,侵删)
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。