GateWay部分接口理解之GatewayFilter、GlobalFilter
1 public interface GlobalFilter { 2 Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain); 3 }
全局过滤器
当网关模块,我们定义filter时,首先需要实现上述接口,并加入到spring容器中 ,filter按自己业务是否需要 @Order/接口形式来指定执行的顺序,数字越小,优先级越高。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | @Component public class IPCheckFilter implements GlobalFilter, Ordered { @Override public int getOrder() { return 0 ; } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 获取请求头 HttpHeaders headers = exchange.getRequest().getHeaders(); // 根据ip来进行对比 if (getIp(headers).equals( "黑名单ip" )) { ServerHttpResponse response = exchange.getResponse(); ResponseData data = new ResponseData(); data.setCode( 401 ); data.setMessage( "非法请求,请联系管理员" ); byte [] datas = JsonUtils.toJson(data).getBytes(StandardCharsets.UTF_8); DataBuffer buffer = response.bufferFactory().wrap(datas); response.setStatusCode(HttpStatus.UNAUTHORIZED); response.getHeaders().add( "Content-Type" , "application/json;charset=UTF-8" ); return response.writeWith(Mono.just(buffer)); } return chain.filter(exchange); } } |
-----------------------------------------------------------------------------------------------------------
1 | public interface GatewayFilter extends ShortcutConfigurable {} |
一般是结合AbstractGatewayFilterFactory来做部分模块自定义过滤的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object> { private final static String[] VALIDATE_URL = new String[] { "/auth/login" , "/auth/register" }; @Autowired private ValidateCodeService validateCodeService; @Autowired private CaptchaProperties captchaProperties; private static final String CODE = "code" ; private static final String UUID = "uuid" ; @Override public GatewayFilter apply(Object config) { return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); // 非登录/注册请求或验证码关闭,不处理 if (!StringUtils.containsAnyIgnoreCase(request.getURI().getPath(), VALIDATE_URL) || !captchaProperties.getEnabled()) { return chain.filter(exchange); } try { String rspStr = resolveBodyFromRequest(request); JSONObject obj = JSONObject.parseObject(rspStr); validateCodeService.checkCapcha(obj.getString(CODE), obj.getString(UUID)); } catch (Exception e) { return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage()); } return chain.filter(exchange); }; } private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) { // 获取请求体 Flux<DataBuffer> body = serverHttpRequest.getBody(); AtomicReference<String> bodyRef = new AtomicReference<>(); body.subscribe(buffer -> { CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer()); DataBufferUtils.release(buffer); bodyRef.set(charBuffer.toString()); }); return bodyRef.get(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | spring: cloud: gateway: routes: # 认证中心 - id: ruoyi-auth uri: lb: //ruoyi-auth predicates: - Path=/auth/** filters: # 验证码处理 - CacheRequestFilter - ValidateCodeFilter - StripPrefix= 1 |
此项目学习,参考的若依框架!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!