springcloud如何获取网关封装的头部信息

 更新时间:2022年06月17日 10:35:32   作者:一一可可  
这篇文章主要介绍了springcloud获取网关封装的头部信息,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

后台系统如何获取请求头里的数据

1. 网关层封装数据到head头

@Component
@Slf4j
public class LoginGatewayFilterFactory extends AbstractGatewayFilterFactory {
 
    @Override
    public GatewayFilter apply(Object config) {
        return (exchange, chain) -> {
            // 获取 request
            ServerHttpRequest req = exchange.getRequest();
            URI uri = req.getURI();
            // 日志
            log.info(StringUtils.join("【", req.getMethod(), "】", uri.getHost(), ":", uri.getPort(), ", 【path】", uri.getPath()));
            // 检查请求 uri 是否需要鉴权
            String path = uri.getPath();
            if (StringUtils.equalsAny(path, "/sysLogin")) {
                return chain.filter(exchange);
            }
            // 获取请求的 token
            HttpHeaders reqHeaders = req.getHeaders();
            String token = req.getHeaders().getFirst("token");
            if (StringUtils.isBlank(token)) {
                return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "请先登录");
            }
            // 验证 token
            JWT jwt = JWTUtil.parseToken(token);
            if (jwt == null) {
                log.info(StringUtils.join("[token=", token, "]转换为jwt失败"));
                return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "令牌未识别");
            }
            JSONObject json = jwt.getPayloads();
            if (json == null || json.isEmpty() || json.isNull("key") || json.isNull(JWTPayload.ISSUED_AT)) {
                log.info(StringUtils.join("[token=", token, "]解析异常"));
                return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "令牌未识别");
            }
            String userId = json.get("key", String.class);
            if (StringUtils.isBlank(userId)) {
                return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "令牌未识别");
            }
            boolean verify = jwt.setKey(JwtUtils.createKey(userId)).verify();
            if (!verify) {
                return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "令牌未识别");
            }
            // 过期时间
            long seconds = Instant.now().getEpochSecond() - json.get(JWTPayload.ISSUED_AT, Long.class);
            if (seconds < 0) {
                return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "令牌未识别");
            } else if (seconds >= 1500 && seconds <= 1800) {
                // 自动刷新令牌
                ServerHttpResponse httpResponse = exchange.getResponse();
                HttpHeaders repHeaders = httpResponse.getHeaders();
                repHeaders.set("token", JwtUtils.createToken(userId));
            } else if (seconds > 1800) {
                // 登录超时
                return FilterUtil.setParamToResponse(exchange, HttpStatus.UNAUTHORIZED, "登录超时");
            }
            Consumer<HttpHeaders> headersConsumer = httpHeaders -> {
                for (Map.Entry<String, List<String>> entry : reqHeaders.entrySet()) {
                    httpHeaders.put(entry.getKey(), entry.getValue());
                }
                httpHeaders.add("userId", userId);
            };
            return chain.filter(exchange.mutate().request(req.mutate().headers(headersConsumer).build()).build());
        };
    }
 
}

2. controller层代码实现

    @ApiOperation(value = "添加")
    @PostMapping("")
    public PojoBaseResponse<Boolean> add(@RequestBody @Validated MainRouteDTO vo, @RequestHeader String userId) {
        return ResponseUtils.pojo(mainRouteService.add(vo, userId));
    }

到此这篇关于springcloud获取网关封装的的文章就介绍到这了,更多相关springcloud网关头部信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • try catch finally的执行顺序深入分析

    try catch finally的执行顺序深入分析

    首先执行try,如果有异常执行catch,无论如何都会执行finally,当有return以后,函数就会把这个数据存储在某个位置,然后告诉主函数,我不执行了,接下来你执行吧,所以函数就会推出
    2013-09-09
  • 使用Java 8 Lambda表达式将实体映射到DTO的操作

    使用Java 8 Lambda表达式将实体映射到DTO的操作

    这篇文章主要介绍了使用Java 8 Lambda表达式将实体映射到DTO的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 详解如何将springboot项目导出成war包

    详解如何将springboot项目导出成war包

    这篇文章主要介绍了详解如何将springboot项目导出成war包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java实现按年月打印日历功能【基于Calendar】

    Java实现按年月打印日历功能【基于Calendar】

    这篇文章主要介绍了Java实现按年月打印日历功能,涉及java基于Calendar进行日期运算的相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • 实时计算知多少?

    实时计算知多少?

    这篇文章对滑动窗口计数的概念和关键代码做了较为详细解释,让我们对实时计算这一概念有了更深的了解,需要的朋友可以参考下
    2015-07-07
  • Netty组件NioEventLoopGroup创建线程执行器源码解析

    Netty组件NioEventLoopGroup创建线程执行器源码解析

    这篇文章主要介绍了Netty组件NioEventLoopGroup创建线程执行器源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java Base64编码方法详解及实例解析

    Java Base64编码方法详解及实例解析

    Base64是一种用于将二进制数据转换成文本数据的编码方式,在本文中,我们介绍了Base64.encodeBase64String方法的用途和功能,它是Java语言中用于Base64编码的一个重要工具,需要的朋友可以参考下
    2023-09-09
  • 详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则

    在本文里我们给大家详细分享了关于java内部类的访问格式和规则知识点内容,有兴趣的朋友们学习下。
    2018-10-10
  • Java并发编程之ReentrantLock实现原理及源码剖析

    Java并发编程之ReentrantLock实现原理及源码剖析

    ReentrantLock 是常用的锁,相对于Synchronized ,lock锁更人性化,阅读性更强,文中将会详细的说明,请君往下阅读
    2021-09-09
  • SpringBoot依赖注入的详细介绍、使用技巧

    SpringBoot依赖注入的详细介绍、使用技巧

    在Spring Boot中,依赖注入是一项关键的特性,它通过容器来管理和注入应用程序中的各种组件,本文介绍SpringBoot依赖注入的详细介绍、使用技巧,感兴趣的朋友一起看看吧
    2024-01-01

最新评论