spring cloud alibaba gateway网关过滤器

一、概念
分为局部过滤器和全局过滤器,局部过滤器针对某一路由,全局过滤器针对全部服务
二、局部自定义过滤器
配置名+GatewayFilterFactory

package com.springcloudalibaba.gateway.filter;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;

@Component // 交给Spring容器管理
public class UserGatewayFilterFactory extends AbstractGatewayFilterFactory  {
    public static final String[] KEY_ARRAY = {"minId", "maxId"};// 对象属性
    public UserGatewayFilterFactory() { //构造函数
        super(UserGatewayFilterFactory.Config.class);
    }
    @Override
    public List shortcutFieldOrder() { // 读取配置文件内容,赋值到配置类属性
        return Arrays.asList(KEY_ARRAY);
    }
    @Override
    public GatewayFilter apply(UserGatewayFilterFactory.Config config) { // 过滤器逻辑
        return new GatewayFilter() {
            @Override
            public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                String id = exchange.getRequest().getQueryParams().getFirst("id"); // 得到id参数的值
                if (null != id) { // 判断不为null
                    int numberId = Integer.parseInt(id);
                    if (numberId > config.getMinId() && numberId < config.getMaxId()) { // 判断id是否大于最小值 并且 小于最大值
                        return chain.filter(exchange); // 放行
                    }
                }
                byte[] bytes =  ("您不能访问"+id+"用户的数据").getBytes(StandardCharsets.UTF_8); //友好提示
                DataBuffer wrap = exchange.getResponse().bufferFactory().wrap(bytes);
                exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); // 标记为不能访问的状态码
                return exchange.getResponse().writeWith(Flux.just(wrap)); // 返回友好提示
            }
        };
    }
    public static class Config { //配置类,接收配置文件的值
        private Integer minId; // 最小支持查询的id
        private Integer maxId; // 最大支持查询的id
        public void setMinId(Integer minId) {
            this.minId = minId;
        }
        public void setMaxId(Integer maxId) {
            this.maxId = maxId;
        }
        public Integer getMinId() {
            return minId;
        }
        public Integer getMaxId() {
            return maxId;
        }
    }
}

在配置文件中

filters:
  - User=0,1000

三、全局过滤器

package com.springcloudalibaba.gateway.filter;
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.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;

@Component
public class TokenGlobalFilter implements GlobalFilter, Ordered {
    private final String TOKEN_VALUE = "123456"; // 为了模拟,此处写死token
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 业务逻辑处理的方法
        String token = exchange.getRequest().getQueryParams().getFirst("token"); // 得到token参数的值
        if (null != token) { // 判断token不为null
            if (TOKEN_VALUE.equals(token)) { // 判断token是否相等
                return chain.filter(exchange);  // 放行
            }
        }
        byte[] bytes = ("您不能访问" + exchange.getRequest().getPath() + "地址").getBytes(StandardCharsets.UTF_8); //友好提示
        DataBuffer wrap = exchange.getResponse().bufferFactory().wrap(bytes);
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); // 标记为不能访问的状态码(401,Unauthorized)
        return exchange.getResponse().writeWith(Flux.just(wrap)); // 返回友好提示
    }
    @Override
    public int getOrder() { // 排序 数值越小,优先级越高
        return 0;
    }
}

你可能感兴趣的:(gateway,java,spring)