1
创建
IPGlobalFilter
package com.it.filter;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
/**
* 网关里面 通过设置过滤器进行ip拦截
* ip拦截:
* 请求都有一个来源
* 请求-->gateway-->service
* 黑名单:具体的业务服务用黑名单
* 白名单:访问数据库用白名单,防止别人恶意访问
*/
public class IPCheckFilter implements GlobalFilter, Ordered {
/**
* 网关的并发量比较高,不要在网关里面直接操作mysql
* 后台的系统可以查询数据库 用户量 并发量不大
* 如果并发量大 可以查看redis 或则在内存中写好
*/
public static final List<String> BACK_LIST= Arrays.asList("127.0.0.1","192.168.12.115");
/**
* 1.拿到ip
* 2.校验ip是否符合规范
* 3.放行或则拦截
* @param exchange
* @param chain
* @return
*/
@SneakyThrows
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String ip= request.getHeaders().getHost().getHostString();
//查询数据库,看这个ip是否存在在黑名单里面
if (!BACK_LIST.contains(ip)){
//放行
return chain.filter(exchange);
}
//拦截
ServerHttpResponse response = exchange.getResponse();
response.getHeaders().set("content-type","application/json;charset=utf-8");
HashMap<String, Object> map = new HashMap<>(4);
map.put("code", 438);
map.put("msg","你是黑名单");
ObjectMapper objectMapper = new ObjectMapper();
byte[] bytes = objectMapper.writeValueAsBytes(map);
DataBuffer wrap = response.bufferFactory().wrap(bytes);
return response.writeWith(Mono.just(wrap));
}
@Override
public int getOrder() {
return -5;
}
}
多个拦截器组成责任链模式,拦截器的数值越小,拦截器越先执行,被上一个拦截器拦截的请求不会传递到下一个拦截器中。
2
gateway做token验证 流程图
一般把token放在请求头里面,请求头里面是key-value结构,key统一设置成Authorization value统一设置成 bearer token
1.拿到请求的url
2.判断放行
3.拿到请求头
4.拿到token
5.在redis中校验
6.放行或拦截