微服务:从header中获取用户存入当前线程

这篇具有很好参考价值的文章主要介绍了微服务:从header中获取用户存入当前线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、从网关gateway工程filter中解析token携带的当前用户信息并添加到header中

            //获取token携带的id
            Object userid = claimsBody.get("id");
            //在header中添加新的信息
            ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {
                httpHeaders.add("userId", userid + "");
            }).build();
            //重置header
            exchange.mutate().request(serverHttpRequest).build();

        filter完整代码

package com.heima.app.gateway.filter;

import com.heima.app.gateway.util.AppJwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
@Slf4j
public class AuthorizeFilter implements Ordered, GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取request和response对象
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();

        log.info("拦截到请求 {}", request.getURI().getPath());

        //2.判断是否是登录//在header中添加新的信息
        if(request.getURI().getPath().contains("/login")){
            //放行
            return chain.filter(exchange);
        }


        //3.获取token
        String token = request.getHeaders().getFirst("token");
        log.info("获取到token {}", token);

        //4.判断token是否存在
        if(StringUtils.isBlank(token)){
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            log.info("token不存在");
            return response.setComplete();
        }

        //5.判断token是否有效
        try {
            Claims claimsBody = AppJwtUtil.getClaimsBody(token);
            //是否是过期
            int result = AppJwtUtil.verifyToken(claimsBody);
            if(result == 1 || result  == 2){
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                log.info("token过期");
                return response.setComplete();
            }

            //获取token携带的id
            Object userid = claimsBody.get("id");
            //在header中添加新的信息
            ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {
                httpHeaders.add("userId", userid + "");
            }).build();
            //重置header
            exchange.mutate().request(serverHttpRequest).build();

        }catch (Exception e){
            e.printStackTrace();
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }

        log.info("放行===> {}",request.getURI().getPath());
        //6.放行
        return chain.filter(exchange);
    }

    /**
     * 优先级设置  值越小  优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

2、在utils工程下创建一个线程工具类WmThreadLocalUtil

package com.heima.utils.thread;


import com.heima.model.common.wemedia.model.po.WmUser;

public class WmThreadLocalUtil {

    private final static ThreadLocal<WmUser> WM_USER_THREAD_LOCAL = new ThreadLocal<>();

    //存入线程中
    public static void setUser(WmUser wmUser){
        WM_USER_THREAD_LOCAL.set(wmUser);
    }

    //从线程中获取
    public static WmUser getUser(){
        return WM_USER_THREAD_LOCAL.get();
    }

    //清理
    public static void clear(){
        WM_USER_THREAD_LOCAL.remove();
    }

}

     

3、在业务项目中创建拦截器 WmTokenInterceptor 

        得到header中的用户信息并存入当前线程

package com.heima.wemedia.interceptor;

import com.heima.model.common.wemedia.model.po.WmUser;
import com.heima.utils.thread.WmThreadLocalUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Optional;

@Slf4j
public class WmTokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //得到header中的信息
        String userId = request.getHeader("userId");
        Optional<String> optional = Optional.ofNullable(userId);
        if(optional.isPresent()){
            //把用户id存入threadloacl中
            WmUser wmUser = new WmUser();
            wmUser.setId(Integer.valueOf(userId));
            WmThreadLocalUtil.setUser(wmUser);
            log.info("wmTokenFilter设置用户信息到threadlocal中...");
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("清理threadlocal...");
        WmThreadLocalUtil.clear();
    }
}

4、在业务工程中创建配置类WebMvcConfig并实现请求拦截

package com.heima.wemedia.config;

import com.heima.wemedia.interceptor.WmTokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new WmTokenInterceptor()).addPathPatterns("/**");
    }
}

 文章来源地址https://www.toymoban.com/news/detail-637507.html

到了这里,关于微服务:从header中获取用户存入当前线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js获取当前服务器的ip

    如果提供的服务不是域名,而是ip形式,获取当前服务器的IP地址,可以使用JavaScript中的 window.location 对象。 window.location 对象包含当前页面的URL信息,包括主机名、协议、端口号等。可以从 window.location 对象中提取服务器的IP地址。 使用 window.location.hostname 属性获取当前服务器

    2024年02月11日
    浏览(52)
  • Linux 服务器查看每个用户或者当前用户的磁盘占用量及文件同步

    [1]ubuntu查看每个用户或者当前用户的磁盘占用量及磁盘空间清理

    2024年03月26日
    浏览(49)
  • Python3 获取当前服务器公网 IP 地址

    有同学问我如何使用 Python 获取服务器公网的 IP 地址呢?我测试几个发现,方法有很多,好用的就发现一种,即直接使用 Python 自带的 socket 包。 代码示例: 这样就能实现 Python 获取当前服务器公网的 IP 地址了。

    2024年02月06日
    浏览(57)
  • springboot项目要如何获取当前服务器的IP以及当前项目使用的端口号Port

    使用InetAddress类即可,直接看例子: 在配置文件中配置server.port的值,之后通过@Value、@ConfigurationProperties 等方法从配置文件中获取 测试代码: @Value会导致启动报错,无法启动项目: 把@Value注释,启动正常,但是**@ConfigurationProperties获取到的值是0** 我们知道springboot默认的po

    2023年04月08日
    浏览(43)
  • 尝试添加服务器中正在运行的docker容器时报错:当前用户没有运行“docker”的权限

    环境 1,通过vscode ssh到服务器的 2,服务器端有一个contianer,但是无法通过vscode的Dev contianer组件将服务器中正在运行的contianer添加过来 3,值得注意的一点是,我没有把当前用户添加到docker用户组中,这也是报错的原因 报错内容 解决办法 当前用户添加到docker用户组中 然后一

    2024年01月19日
    浏览(51)
  • 【业务功能篇97】微服务-springcloud-springboot-电商购物车模块-获取当前登录用户的购物车信息

      我们需要先创建一个cart的微服务,然后添加相关的依赖,设置配置,放开注解。 然后属性文件中的配置 然后再添加配置中心的配置:bootstrap.yml文件 放开注册中心的注解   首先在windows中的host指定对应域名 拷贝对应的静态资源到Nginx的static/cart目录中 然后修改Nginx的配

    2024年02月09日
    浏览(69)
  • Java 使用 oshi 获取当前服务硬件信息(操作系统、CPU、内存、磁盘)

    这里需要引入两个依赖包: HardWareUtil: CpuInfo: JvmInfo: MemoryInfo: SysFile: SystemDetails: SizeEnum: 控制台输出: CpuInfo(cpuNum=16, total=16501.0, sys=329.0, used=657.0, wait=0.0, free=15419.0) JvmInfo(total=2.64241152E8, max=4.211081216E9, free=2.5297664E8, version=11.0.18, home=C:Program FilesJavajdk-11) SystemDetails(

    2024年02月05日
    浏览(57)
  • 框架获取当前登录用户以及用户信息

    CSDN话题挑战赛第2期 参赛话题:学习笔记 📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端中级工程师 🔥 三连支持:如果此文还不错的话,还请 ❤️关注、👍点赞、👉收藏三连,支持一下博主~ 无论是哪一个框架,获取当前登录用户信息是必不

    2023年04月08日
    浏览(48)
  • JeecgBoot获取当前登录用户信息

    如果使用JeecgBoot项目进行开发的时候,有的场景需要获取当前登录人信息做一些逻辑操作 下面分享下通过前后端分别获取用户的方式 本质是使用vuex进行获取 引入store 使用store获取 org.apache.shiro.SecurityUtils 是使用了Apache Shiro框架的认证,所以这里直接使用SecurityUtils类来获取用

    2024年02月12日
    浏览(62)
  • uniapp获取用户当前位置信息(第一节)

    本篇文章分享一下我在实际开发小程序时遇到的需要获取用户当前位置的问题,在小程序开发过程中经常使用到的获取定位功能。uniapp官方也提供了相应的API供我们使用。 官网地址:uni.getLocation(OBJECT)) 首先根据官网uni.getLocation(OBJECT))来获取地理位置信息 注意:这里面有个大

    2024年02月17日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包