微服务中引入公共拦截器

本文使用的微服务版本为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的依赖,这样这个配置类就不会生效。
相关推荐
码界奇点14 小时前
基于Spring Boot和Vue3的无头内容管理系统设计与实现
java·spring boot·后端·vue·毕业设计·源代码管理
九皇叔叔14 小时前
【03】微服务系列 之Nacos 注册中心(服务注册)
java·微服务·nacos·架构·注册中心·服务注册
国科安芯14 小时前
航空级PMSM驱动系统中MCU的故障诊断与容错控制策略研究
单片机·嵌入式硬件·安全·架构·制造·安全性测试
木辰風15 小时前
PLSQL自定义自动替换(AutoReplace)
java·数据库·sql
heartbeat..15 小时前
Redis 中的锁:核心实现、类型与最佳实践
java·数据库·redis·缓存·并发
Prince-Peng15 小时前
技术架构系列 - 详解Redis
数据结构·数据库·redis·分布式·缓存·中间件·架构
15 小时前
java关于内部类
java·开发语言
好好沉淀15 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
gusijin15 小时前
解决idea启动报错java: OutOfMemoryError: insufficient memory
java·ide·intellij-idea
To Be Clean Coder15 小时前
【Spring源码】createBean如何寻找构造器(二)——单参数构造器的场景
java·后端·spring