iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >springcloud如何获取网关封装的头部信息
  • 300
分享到

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

2024-04-02 19:04:59 300人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

后台系统如何获取请求头里的数据 1. 网关层封装数据到head头 @Component @Slf4j public class LoginGatewayFilterFactory e

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

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网关头部信息内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: springcloud如何获取网关封装的头部信息

本文链接: https://www.lsjlt.com/news/151794.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springcloud如何获取网关封装的头部信息
    后台系统如何获取请求头里的数据 1. 网关层封装数据到head头 @Component @Slf4j public class LoginGatewayFilterFactory e...
    99+
    2022-11-13
  • PHP怎么获取指定网址的header头信息及隐藏关闭的方法
    这篇文章给大家分享的是有关PHP怎么获取指定网址的header头信息及隐藏关闭的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、PHP如何获取指定URL的header信息超级简单,就一行命令即可:<p...
    99+
    2023-06-14
  • 小程序开发如何获取节点的相关信息
    本篇内容主要讲解“小程序开发如何获取节点的相关信息”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“小程序开发如何获取节点的相关信息”吧!获取节点的相关信息,需要获取的字段在fields中指定。返回...
    99+
    2023-06-26
  • 微信小程序如何异步获取当前storage的相关信息
    这篇“微信小程序如何异步获取当前storage的相关信息”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“微信小程序如何异步获取当前storage的相关信息”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥...
    99+
    2023-06-26
  • 微信小程序如何同步获取当前storage的相关信息
    这篇文章主要为大家展示了微信小程序如何同步获取当前storage的相关信息,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“微信小程序如何同步获取当前storage的相关信息”这篇文章吧。同步获取当前...
    99+
    2023-06-26
  • python os.stat()如何获取相关文件的系统状态信息
    目录python os.stat()获取相关文件的系统状态信息下面直接以一个具体示例来进行简要说明python os模块的常用操作python os.stat()获取相关文件的系统状...
    99+
    2022-11-11
  • 如何通过zabbix获取数据库连接的信息及部分扩展
    本篇内容介绍了“如何通过zabbix获取数据库连接的信息及部分扩展”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景随着应用系统的不断增加,...
    99+
    2023-06-20
  • 如何使用GitHub关注他人并获取有价值的代码和信息
    GitHub是全球最大的代码托管平台之一,它不仅可以方便地管理和分享代码,还可以通过关注其他开发者,获取最新的技术资讯和有价值的代码,是每一个程序员必备的工具之一。本文将详细介绍如何使用GitHub关注他人并获取有价值的代码和信息。一、创建...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作