美文网首页
微服务中用户信息传递的解决方案

微服务中用户信息传递的解决方案

作者: 无我_无他_有你 | 来源:发表于2022-02-23 14:16 被阅读0次

思路:

  1. gateway网关过滤器中将用户信息添加到请求头中
  2. 被转发的服务中,写一个拦截器,拦截所有请求,获取请求头的用户信息,存入到threadLocal中
  3. 拦截器在请求结束时清除threadLocal中的内容

1.网关过滤器

package pers.darcy.flower.gateway.service.filter;

/**
 * @author wqf
 * @date 2021/07/11
 * 类描述:全局过滤器 用于处理用户鉴权的等
 */ 省略无关代码
@Slf4j
@Component
public class CustomerGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ...
        //.白名单请求校验 ...
        //请求合法性校验 ...
        //token合法性校验 ..
        //用户权限校验 ...
        Claims claims = JwtTokenUtil.parseToken(accessToken, privateKey);//解密jwt token 获取用户信息
        //以下两行代码表示把token放入请求头中
        ServerHttpRequest shr = request.mutate().header("TokenInfo", JSON.toJSONString(claims )).build();
        exchange.mutate().request(shr).build();
        return chain.filter(exchange);
    }


    @Override
    public int getOrder() {
        return 0;
    }
}

2.拦截器代码如下

@Slf4j
public class UserInterceptor implements HandlerInterceptor {
    /**
     * 服务间调用的认证token
     */
    public static final String TOKEN_INFO = "TokenInfo";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String userInfo = request.getHeader(TOKEN_INFO);
        TokenInfo tokenInfo = JSONUtil.toBean(userInfo, TokenInfo.class);//TokenInfo  存储用户信息的实体类
        UserContext.getInstance().setContext(tokenInfo);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        UserContext.getInstance().clear();
    }
}

3.注册拦截器

/**
 * 类说明: 拦截器注册
 *
 * @author wqf
 * @date 2022/2/23 13:49
 */
@Configuration
public class WebServerMvcConfigurerAdapter implements WebMvcConfigurer {

    @Bean
    public HandlerInterceptor userInterceptor() {
        return new UserInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userInterceptor());
    }
}

工具类

package pers.darcy.flower.utils.util;

import pers.darcy.flower.utils.domain.token.TokenInfo;

/**
 * @author yao
 * @date 2021/6/28 11:01
 */
public class UserContext {

    private ThreadLocal<TokenInfo> threadLocal;

    private UserContext() {
        this.threadLocal = new ThreadLocal<>();
    }

    /**
     * 创建实例
     */
    public static UserContext getInstance() {
        return SingletonContext.S_INSTANCE;
    }

    /**
     * 静态内部类单例模式
     * 单例初使化
     */
    private static class SingletonContext {
        private static final UserContext S_INSTANCE = new UserContext();
    }

    /**
     * 用户上下文中放入信息
     */
    public void setContext(TokenInfo tokenInfo) {
        threadLocal.set(tokenInfo);
    }

    /**
     * 获取上下文中的信息
     */
    public TokenInfo getContext() {
        return threadLocal.get();
    }

    /**
     * 获取上下文中的用户名
     */
    public String getUsername() {
        return getContext().getUsername();
    }

    /**
     * 获取上下文中的用户id
     */
    public Long getUserId() {
        return getContext().getId();
    }

    /**
     * 清空上下文
     */
    public void clear() {
        threadLocal.remove();
    }
}

微服务中每个服务都需要配置拦截器,可以把拦截器部分代码方法公共代码模块,其他工程引入即可

PS:接下来可以去了解feign远程调用的token传递

以上仅供参考

相关文章

  • 微服务中用户信息传递的解决方案

    思路: gateway网关过滤器中将用户信息添加到请求头中 被转发的服务中,写一个拦截器,拦截所有请求,获取请求头...

  • Spring Cloud Feign如何实现JWT令牌中继,传递

    Spring Cloud微服务调用的过程中需要令牌中继。只有令牌中继才能在调用链中保证用户认证信息的传递。今天就来...

  • 获取微信用户openId思路

    微信用户在使用微信公众号过程中,后台服务器经常要判断是哪个用户的请求,以便于查询该用户相关信息。这样免去了只有用户...

  • 表单基础

    在日常使用网页浏览信息的过程中免不了要搜索一些信息,或写篇文章需要发布。那我们是用什么方式把用户的信息传递给服务器...

  • 设计中标题文字如何处理更吸引人?

    我们常说:设计就是在向用户传递信息,在设计的日常工作中,传递信息的方式大多都是图文相结合的形式,而文字作为信息传递...

  • 设计中标题文字如何处理更吸引人?

    我们常说:设计就是在向用户传递信息,在设计的日常工作中,传递信息的方式大多都是图文相结合的形式,而文字作为信息传递...

  • 自身微信公众号打造的4个方法

    1、微信公众号定位:订阅号与服务好的定位不同 订阅号为用户提供信息和资讯,服务号主要为用户提供服务!群发信息量不同...

  • 信息产品的三个关键页面

    信息产品即是以向用户提供信息、传递信息为核心服务的产品,它的整个工业流程包括采集、存储、传输和检索。Web2...

  • 信息服务

    信息服务是信息管理活动的出发点和归宿,是信息管理研究中重要内容和领域。研究用户,组织用户,组织服务,将有价值的信息...

  • 茴香豆安全 - 会话劫持,登录别人的账号

    一、前言 所谓会话,简单理解就是用户在浏览某个网站的过程中和服务器的通信,通信过程中会传递一些用户信息,以便服务器...

网友评论

      本文标题:微服务中用户信息传递的解决方案

      本文链接:https://www.haomeiwen.com/subject/yjuolrtx.html