1
概述
gateway 里面的过滤器和 Servlet 里面的过滤器,功能差不多,路由过滤器可以用于修改进入Http 请求和返回 Http 响应
2
分类
2.1
按生命周期分两种
pre 在业务逻辑之前
post 在业务逻辑之后
2.2
按种类分也是两种
GatewayFilter 需要配置某个路由,才能过滤。如果需要使用全局路由,需要配置 Default Filters。
GlobalFilter 全局过滤器,不需要配置路由,系统初始化作用到所有路由上
全局过滤器 统计请求次数 限流
token
的校验
ip
黑名单拦截 跨域本质
(filter)
144
开头的电话 限制一些
ip
的访问
3
官方文档查看过滤器
3.1
单一过滤器(
31
个)
https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/
html/#gatewayfilter-factories
3.2
全局过滤器(9
个)

4 自定义网关过滤器(重点)
4.1
自定义全局过滤器
全局过滤器的优点的初始化时默认挂到所有路由上,我们可以使用它来完成
IP
过滤,限流等功能
4.2
创建配置类MyGlobalFilter
package com.it.filter;
import com.fasterxml.jackson.databind.ObjectMapper;
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;
import java.net.URI;
import java.util.HashMap;
/**
* 定义了一个过滤器,
* 需要给该过滤器指定执行顺序,通常一个项目中有多个过滤器,组成过滤器的责任链模式。
*/
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
/**
* 这个就是全部过滤的方法
* 常用责任链模式
* @param exchange
* @param chain
* @return
*/
@lombok.SneakyThrows
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//针对请求的过滤,拿到请求 header url 参数
ServerHttpRequest request = exchange.getRequest();
String uri = request.getURI().getPath();
System.out.println(uri);
HttpHeaders headers = request.getHeaders();
System.out.println(headers);
String name = request.getMethod().name();
System.out.println(name);
String hostName = request.getRemoteAddress().getHostName();
System.out.println(hostName);
//响应相关的
ServerHttpResponse response = exchange.getResponse();
//放行,转入下一个过滤器
// return chain.filter(exchange);
//不放行
response.getHeaders().set("content-type","application/json;charset=utf-8");
//组装业务返回值
HashMap<Object, Object> map = new HashMap<>();
map.put("code", HttpStatus.UNAUTHORIZED.value());
map.put("msg","你未授权!");
ObjectMapper objectMapper = new ObjectMapper();
//因为返回类型为Mono<Void>,所以需要把map转换成一个字节
byte[] bytes = objectMapper.writeValueAsBytes(objectMapper);
//通过buffer工厂将字节数组包装成一个数据包
DataBuffer wrap = response.bufferFactory().wrap(bytes);
return response.writeWith(Mono.just(wrap));
}
/**
* 指定过滤器执行顺序的方法
* 越小越先执行
* @return
*/
@Override
public int getOrder() {
return -1;
}
}