• 首页

  • 归档

  • 分类

  • 标签

  • 喵星人

  • 心情

  • 关于
W e A r e F a m i l y ! m i a o ~
W e A r e F a m i l y ! m i a o ~

柴子

青春流逝,记录往昔

07月
06
后端

gateway转发微服务请求丢失header参数

发表于 2021-07-06 • 字数统计 3784 • 被 1,016 人看爆

gateway转发微服务请求丢失header参数,因为项目中集成了SpringCloudOauth2做鉴权中心,网关做统一鉴权,鉴权后还希望将header中的token原样的转发到后续的微服务中。转发的时候重新构建下请求就可以了

ServerHttpRequest req = exchange.getRequest().mutate().headers(header -> header.add(HttpHeaders.AUTHORIZATION, token)).build();
ServerWebExchange webExchange = exchange.mutate().request(req).build();
return chain.filter(webExchange);

全部代码

package com.chai.filters;


import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
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
public class TokenFilter implements GlobalFilter, Ordered {


    @Value("${jwtSignStr}")
    private String jwtSignStr;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String access_token = exchange.getRequest().getQueryParams().getFirst("access_token");
        if (Strings.isBlank(access_token)) {
            HttpHeaders headers = exchange.getRequest().getHeaders();
            access_token = exchange.getRequest().getHeaders().getFirst("Authorization").replaceAll("Bearer","").trim();
        }
        if (Strings.isBlank(access_token)) {
            DataBuffer dataBuffer = exchange.getResponse().bufferFactory().wrap("access_token is must required parameter".getBytes());
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().writeWith(Mono.just(dataBuffer));
        }
        try {
            Algorithm algorithm = Algorithm.HMAC256(jwtSignStr);
            JWTVerifier verifier = JWT.require(algorithm).build();
            verifier.verify(access_token);
            String token = access_token;
            ServerHttpRequest req = exchange.getRequest().mutate().headers(header -> header.add(HttpHeaders.AUTHORIZATION, token)).build();
            ServerWebExchange webExchange = exchange.mutate().request(req).build();
            return chain.filter(webExchange);
        } catch (JWTDecodeException e) {
            DataBuffer dataBuffer = exchange.getResponse().bufferFactory().wrap("access_token is bad format".getBytes());
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().writeWith(Mono.just(dataBuffer));
        } catch (TokenExpiredException e) {
            DataBuffer dataBuffer = exchange.getResponse().bufferFactory().wrap("The access_token has expired".getBytes());
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().writeWith(Mono.just(dataBuffer));
        } catch (Exception e) {
            e.printStackTrace();
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
    }

    @Override
    public int getOrder() {
        return 1;
    }

}

分享到:
mybatis-plus代码生成器
mac安装brew
  • 文章目录
  • 站点概览
柴子

内蒙 柴子

what do U want?

Github QQ Email RSS
最喜欢的电影
最喜欢的游戏
最喜欢的音乐
最喜欢的图书
最喜欢的动漫
夏洛特的烦恼
英雄联盟
痴心绝对
数据库从入门到删库跑路
斗破苍穹
看爆 Top5
  • 微信getUserProfile兼容性调整以及uniapp写法 2,041次看爆
  • gateway转发微服务请求丢失header参数 1,017次看爆
  • mybatis-plus代码生成器 950次看爆
  • SpringBoot防重复提交与限流的优雅解决 547次看爆
  • Spring Boot Security从入门到进阶到高级 544次看爆
转载注明出处

站点已萌萌哒运行 00 天 00 小时 00 分 00 秒(●'◡'●)ノ♥

Copyright © 2022 柴子 京ICP备17035556号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图