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

相关推荐
STDD1 分钟前
VictoriaLogs:轻量级日志存储方案,Loki 的高效替代
运维·jenkins
枳实-叶9 分钟前
【Linux驱动开发】第18天:I2C驱动深度解析
linux·运维·驱动开发
shandianchengzi13 分钟前
【记录】Ubuntu|Ubuntu 26.04 笔记本耗电过快,排查 省电过程
linux·运维·ubuntu
一叶星殇17 分钟前
日志成海,何以检索:Serilog 解锁 .NET 日志可查询新范式
运维·服务器
企服AI产品测评局18 分钟前
AI Agent实测:Agent Store现成应用如何重塑企业自动化?
运维·人工智能·ai·chatgpt·自动化
上海云盾安全满满20 分钟前
服务器不稳定,丢包有哪些原因?
运维·服务器
陳103021 分钟前
Linux:信号
linux·运维·服务器
tongluowan00723 分钟前
负载均衡之硬件与软件层面的异同
运维·nginx·负载均衡·f5
小此方28 分钟前
Re:Linux系统篇(二十五)进程篇·十:深度硬核!Linux 进程等待,从 task_struct 源码到位图状态解构
linux·运维·驱动开发
会Tk矩阵群控的小木34 分钟前
企业级iMessage群发系统实战:单主机管控多iPhone设备完整实现
运维·ios·开源软件·个人开发