微服务:从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日
    浏览(54)
  • Linux 服务器查看每个用户或者当前用户的磁盘占用量及文件同步

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

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

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

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

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

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

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

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

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

    2024年02月09日
    浏览(75)
  • 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日
    浏览(60)
  • 框架获取当前登录用户以及用户信息

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

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

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

    2024年02月12日
    浏览(66)
  • PHP获取当前用户的真实IP

    在 PHP 中可通过 $_SERVER 全局变量获取客户端IP,常用的有以下两个变量: $_SERVER[\\\'REMOTE_ADDR\\\'] :浏览当前页面的用户的 IP 地址 $_SERVER[\\\'HTTP_X_FORWARDED_FOR\\\'] :如果用户使用了代理服务器,则获取用户的真实 IP 地址可使用此变量。 以下是获取客户端真实IP的示例代码: 该函数会检测

    2024年02月07日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包