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

相关推荐
cuijiecheng2018几秒前
Linux下ss命令用法
linux·运维·服务器
云上工程笔记3 分钟前
4090 GPU 服务器适合哪些 AI 场景?2026 年显存、推理性能、租用价格和风险对比
运维·服务器·人工智能
智购科技自动售卖机厂家4 分钟前
2026自动售货机云端数据备份策略:从全量备份到增量恢复的工程实践~YH
数据库·stm32·嵌入式硬件·物联网·架构·零售
mennekes27 分钟前
光伏场站检修电源:户外工业连接器防腐与防雷选型方案
运维·科技·安全·制造
名字还没想好☜31 分钟前
kubectl 排障实战:jsonpath 精准取值、custom-columns、events 排序与 top 速查
运维·前端·chrome·docker·kubernetes
Doraemomo32 分钟前
Linux编程-epoll多路IO复用
linux·运维·服务器
wtblszn36 分钟前
城市二供泵站远程监控运维系统物联网方案
运维·物联网
白猫不黑1 小时前
运维如何转安全(个人经验篇)
运维·学习·安全·web安全·网络安全·信息安全
Tanner_SL1 小时前
Linux笔记之PATH, LD_LIBRARY_PATH和LIBRARY_PATH的区别
linux·运维·笔记
易番番ERP1 小时前
筹备ERP项目|前期认知与调研的核心要点
微服务·云原生·易番番erp