springcloud-Finchley学习笔记-gateway网关自定义过滤器

Posted nnsword

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud-Finchley学习笔记-gateway网关自定义过滤器相关的知识,希望对你有一定的参考价值。

创建过滤器代码:验证令牌过滤不完整版本

/**
 * 令牌验证过滤器
 * @author wuxie
 * @date 2019-1-14
 */
public class TokenValidateGatewayFilterFactory extends AbstractGatewayFilterFactory<TokenValidateGatewayFilterFactory.Config> 

    private static Logger logger= LoggerFactory.getLogger(TokenValidateGatewayFilterFactory.class);

    private final JsonMapper jsonMapper;

    public TokenValidateGatewayFilterFactory(JsonMapper jsonMapper) 
        super(Config.class);
        this.jsonMapper = jsonMapper;
    

    @Override
    public GatewayFilter apply(Config config) 
        return (exchange, chain) -> 
            logger.info("TokenValidateGatewayFilterFactory...");
            String token = exchange.getRequest().getHeaders().getFirst("Authorization");
            //校验token的合法性
            boolean tokenValidated= true;
            if (tokenValidated) 
                // 令牌合法,继续访问,可以进行一些处理,如:添加头信息,参数等
                ServerHttpRequest.Builder builder = exchange.getRequest().mutate();
                //比如,根据令牌获得用户信息,userId
                builder.header("ch-userId", Base64Utils.encodeFromString("用户Id"));
                return chain.filter(exchange.mutate().request(builder.build()).build());
            
            //令牌不合法
            ServerHttpResponse response = exchange.getResponse();
            //设置headers
            HttpHeaders httpHeaders = response.getHeaders();
            httpHeaders.add("Content-Type", "application/json; charset=UTF-8");
            httpHeaders.add("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
            //过滤器中跨域需要自己处理
            //设置body
            ResultEntity<String> resultEntity = ResultEntityBuilder.fail("没有访问权限");
            String resultStr = jsonMapper.toString(resultEntity,true);
            DataBuffer bodyDataBuffer = response.bufferFactory().wrap(resultStr.getBytes());

            return response.writeWith(Mono.just(bodyDataBuffer));
        ;
    

    public static class Config

    

将过滤器注册成Bean对象

/**
 * 应用配置
 * @author wuxie
 * @date 2019-1-14
 */
@Configuration
public class AppConfig 

    @Bean
    public TokenValidateGatewayFilterFactory tokenValidateGatewayFilterFactory(JsonMapper jsonMapper)
        return new TokenValidateGatewayFilterFactory(jsonMapper);
    

配置gateway配置:只需要配置过滤类的前缀即可

spring:
  cloud:
    gateway:
      default-filters:
        - TokenValidate

此处是配置是全局过滤器了,也可以直接配置到某个路由上。

以上是关于springcloud-Finchley学习笔记-gateway网关自定义过滤器的主要内容,如果未能解决你的问题,请参考以下文章

(转)Akka学习笔记

JavaWeb学习笔记总结 目录篇

系列文章--Node.js学习笔记系列

Windows编程课程学习笔记

Windows编程课程学习笔记

2022年Spark基础学习笔记