gateway过滤器

过滤分为前置过滤和后置过滤


过滤器种类


但是,一般都自己实现过滤器(不用内置的)

放行

自定义一个过滤器如下

@Component
public class MyGateWayFilter implements GlobalFilter, Ordered {
    /**
     * 过滤方法
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 和HttpServletRequest类似
        ServerHttpRequest request = exchange.getRequest();
        // 和HttpServletResponse类似
        ServerHttpResponse response = exchange.getResponse();
        String path = request.getURI().getPath();
        System.out.println("path = " + path);
        String method = request.getMethod().name();
        System.out.println("method = " + method);
        String hostName = request.getHeaders().getHost().getHostName();
        System.out.println("hostName = " + hostName);
        // 放行
        return chain.filter(exchange);
    }

    /**
     * 顺序,越小越优先执行
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
path = /doLogin
method = GET
hostName = localhost

拦截(返回json)

@Component
public class MyGateWayFilter implements GlobalFilter, Ordered {
    /**
     * 过滤方法
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 和HttpServletRequest类似
        ServerHttpRequest request = exchange.getRequest();
        // 和HttpServletResponse类似
        ServerHttpResponse response = exchange.getResponse();
        String path = request.getURI().getPath();
        System.out.println("path = " + path);
        String method = request.getMethod().name();
        System.out.println("method = " + method);
        String hostName = request.getHeaders().getHost().getHostName();
        System.out.println("hostName = " + hostName);

        
        // 返回json
        response.getHeaders().set("content-type","application/json;charset=utf-8");
        // 初始容量:元素个数/0.75+1
        Map<String,Object> map = new HashMap<>(4);
        //401 未授权
        map.put("code", HttpStatus.UNAUTHORIZED.value());
        map.put("msg","未授权");

        ObjectMapper objectMapper = new ObjectMapper();
        byte[] bytes = new byte[0];
        try {
            bytes = objectMapper.writeValueAsBytes(map);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        DataBuffer dataBuffer = response.bufferFactory().wrap(bytes);
        return response.writeWith(Mono.just(dataBuffer));
        
        // 放行
        // return chain.filter(exchange);
    }

    /**
     * 顺序,越小越优先执行
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

实现ip过滤

将MyGateWayFilter 中的逻辑改为放行

增加一个IpGateWayFilter

@Component
public class IpGateWayFilter implements GlobalFilter, Ordered {

    /**
     * ip黑名单
     */
    public static final List<String> BLACK_LIST = Arrays.asList("127.0.0.1","144.128.0.1");

    /**
     * 过滤方法
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 和HttpServletRequest类似
        ServerHttpRequest request = exchange.getRequest();
        // 和HttpServletResponse类似
        ServerHttpResponse response = exchange.getResponse();
        String hostName = request.getHeaders().getHost().getHostName();
        System.out.println("hostName = " + hostName);
        //不包含在黑名单内,放行
        if(!BLACK_LIST.contains(hostName)){
            return chain.filter(exchange);
        }

        // 返回json
        response.getHeaders().set("content-type","application/json;charset=utf-8");
        // 初始容量:元素个数/0.75+1
        Map<String,Object> map = new HashMap<>(4);
        //401 未授权
        map.put("code", 438);
        map.put("msg","ip黑名单");

        ObjectMapper objectMapper = new ObjectMapper();
        byte[] bytes = new byte[0];
        try {
            bytes = objectMapper.writeValueAsBytes(map);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        DataBuffer dataBuffer = response.bufferFactory().wrap(bytes);
        return response.writeWith(Mono.just(dataBuffer));
    }

    /**
     * 顺序,越小越优先执行
     * @return
     */
    @Override
    public int getOrder() {
        return -5;
    }
}

使用localhost访问,没有问题


使用127.0.0.1访问,被拦截


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容