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

相关文章

  • 浅析Android系统中HTTPS通信的实现

    浅析Android系统中HTTPS通信的实现

    这篇文章主要介绍了浅析Android系统中HTTPS通信的实现,实现握手的源码为Java语言编写,需要的朋友可以参考下
    2015-07-07
  • 解读@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的区别及在springboot常用地方

    解读@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstr

    这篇文章主要介绍了解读@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的区别及在springboot常用地方,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 通过Java实现获取表的自增主键值

    通过Java实现获取表的自增主键值

    这篇文章主要为大家详细介绍了如何通过Java实现获取表的自增主键值,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-06-06
  • 解决idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题

    解决idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题

    这篇文章主要介绍了idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java中堆和栈的区别详解

    Java中堆和栈的区别详解

    这篇文章主要介绍了Java中堆和栈的区别详解,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然是JVM(虚拟)内存中的堆和栈,需要的朋友可以参考下
    2015-01-01
  • 关于java 图形验证码的解决方法

    关于java 图形验证码的解决方法

    本篇文章小编为大家介绍,在java中,使用图形验证码的解决方法。需要的朋友参考下
    2013-04-04
  • springboot整合mybatis实现简单的一对多级联查询功能

    springboot整合mybatis实现简单的一对多级联查询功能

    这篇文章主要介绍了springboot整合mybatis实现简单的一对多级联查询功能,分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • win10系统64位jdk1.8的下载与安装教程图解

    win10系统64位jdk1.8的下载与安装教程图解

    这篇文章主要介绍了win10系统64位jdk1.8的下载与安装教程图解,本文给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Java多线程之线程同步

    Java多线程之线程同步

    这篇文章主要介绍了Java多线程之线程同步,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法

    Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法

    这篇文章给大家介绍了spring-boot中如何定义过滤器、监听器和拦截器,对Spring Boot 编写Servlet、Filter、Listener、Interceptor的相关知识感兴趣的朋友一起看看吧
    2017-07-07

最新评论