IT自学第四十三天(微服务登录认证)

微服务


8、传递用户信息-用户信息写入请求头

网关传递用户

步骤:一、在网关的登录效验过滤器中,把获取到的用户写入请求头

需求:修改gateway模块中的登录效验拦截器,在效验成功后保存用户到下游请求的请求头中。

提示:要修改转发到微服务的请求,需要用到ServerWebExchange类提供的API,示例如下:

代码演示:

java 复制代码
Long userId = jwtTool.parseToken(token);
//4、将用户信息传递给后端
System.out.println("userId:"+userId);
//将用户id设置到请求头,改为request对象,设置请求头到后端的微服务
exchange.mutate().request(builder->{builder.header("user-info",userId.toString()).build();});

代码演示:

java 复制代码
    @ApiOperation("查询购物车列表")
    @GetMapping
    public List<CartVO> queryMyCarts(@RequestHeader(value="user-info",required = false) Long userId){
        System.out.println("--------------userId"+userId);
        return cartService.queryMyCarts();
    }

9、微服务拦截器分析

把拦截器写到common中,都可以调用。

步骤:二、在hm-common中编写SpringMVC拦截器,获取登录用户

实现步骤:

10、微服务拦截器实现-用户信息传递

代码演示:

java 复制代码
public class UserInfoInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取请求头user-info
        String userId = request.getHeader("user-info");
        //如果有值的话设置到线程版本ThreadLocal中
        if(StrUtil.isNotBlank(userId)){
            UserContext.setUser(Long.parseLong(userId));
        }

        return true;
    }


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //请求执行完成后要清除ThreadLocal中信息
        UserContext.removeUser();
    }
}

代码演示:

java 复制代码
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInfoInterceptor());
    }
}

11、OpenFeign传递用户信息

OpenFeign传递用户

微服务项目中的很多业务要多个微服务共同合作完成,而这个过程中也需要传递登录用户信息,例如:

OpenFeign中提供了一个拦截器接口,所有由OpenFeign发起的请求都会先调用拦截器处理请求:

步骤:OpenFeign传递用户

代码演示:

java 复制代码
    //feign请求拦截器
    @Bean
    public RequestInterceptor feignRequestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                //获取线程变量中的用户Id
                Long userId = UserContext.getUser();
                //设置feign请求头
                if (userId != null) {
                    template.header("user-info", userId.toString());
                }
            }
        };
    }

12、Nacos配置共享配置项文件

相关推荐
Championship.23.246 小时前
Linux 3.0 锁机制与故障排查详解
linux·运维·服务器
herosunly6 小时前
60ms 不是启动快,而是不用重新启动:CubeSandbox 极速冷启动架构拆解
架构·cube sandbox
zlinear数据采集卡7 小时前
从气动比例阀到任意波形:硬核拆解ZLinear采集卡的DAC输出架构与工业闭环控制实战
arm开发·架构
风123456789~8 小时前
【Linux专栏】ls 排除某个文件
linux·运维·服务器
其实防守也摸鱼9 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
2601_961946089 小时前
AI API 网关实战:从单 Key 管理到企业级多租户架构
大数据·人工智能·金融·架构·api·个人开发
Darkwanderor10 小时前
对Linux的进程控制的研究
linux·运维·c++
考虑考虑11 小时前
Sentinel安装
java·后端·微服务
XUHUOJUN11 小时前
Windows 2025架构深度分析之Stretch Cluster 延迟工程现实
windows·microsoft·架构·azure local
Web极客码11 小时前
突破并发瓶颈:云端高性能架构如何赋能海外 AI Agent 矩阵的高效产出
服务器·人工智能·架构