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配置共享配置项文件

相关推荐
Patrick_Wilson1 小时前
幂等到底是什么?从前端视角讲透 SQL、HTTP 与 POST 接口的幂等设计
前端·后端·架构
SamDeepThinking3 小时前
Java微服务练习方式
java·后端·微服务
禅思院3 小时前
Vite vs Webpack 深度对比:从启动原理到生产构建,一篇就够了
前端·架构·前端框架
SelectDB18 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
Cerrda1 天前
开发体验升级:UnoCSS 自定义 SVG 图标热更新方案
架构·前端框架
Kstheme1 天前
把任何 GitHub 仓库变成系统设计课:这个开源项目做到了
架构
禅思院1 天前
路由性能高可用架构实战方案
前端·架构·前端框架
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
贵慜_Derek2 天前
《从零实现 Agent 系统》连载 32|闭集 IE 与小模型:分类、意图与字段抽取
人工智能·架构·agent
江米小枣tonylua3 天前
译:设计生产级 RAG 架构
架构