过滤分为前置过滤和后置过滤
过滤器种类
但是,一般都自己实现过滤器(不用内置的)
放行
自定义一个过滤器如下
@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访问,被拦截