一。导包
二。GlobalFilter:全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它为请求业务以及路由的URI转换为真实业务服务的请求地址的核心过滤器,不需要配置,系统初始化时加载,并作用在每个路由上。 这里我们模拟了一个登陆检查的Filter.
@Component @Slf4j public class TimeGlobleFilter implements GlobalFilter , Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { List<String> token = exchange.getRequest().getHeaders().get("token"); log.info("检查 TOKEN = {}" ,token); if(token == null || token.isEmpty()){ //响应对象 ServerHttpResponse response = exchange.getResponse(); //构建错误结果 HashMap<String,Object> data = new HashMap<>(); data.put("code",401); data.put("message","未登录"); DataBuffer buffer = null; try { byte[] bytes = JSON.toJSONString(data).getBytes("utf-8"); buffer = response.bufferFactory().wrap(bytes); //设置完成相应,不会继续执行后面的filter //response.setComplete(); response.setStatusCode(HttpStatus.UNAUTHORIZED); response.getHeaders().add("Content-Type","application/json;charset=UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //把结果写给客户端 return response.writeWith(Mono.just(buffer)); } log.info("Token不为空 ,放行"); return chain.filter(exchange); } @Override public int getOrder() { return 0; } }
如果请求头中没有 token ,就返回咩有权限的状态吗。
使用 buffer = response.bufferFactory().wrap(bytes)
构建响应内容,通过response.writeWith(Mono.just(buffer));
把内容写给客户端。