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

发布时间:2023-05-14 09:30

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

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 headersConsumer = httpHeaders -> {
                for (Map.Entry> 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 add(@RequestBody @Validated MainRouteDTO vo, @RequestHeader String userId) {
        return ResponseUtils.pojo(mainRouteService.add(vo, userId));
    }

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

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号