SpringCloud Gateway 自定义Filter用代码怎么写?别再说我只会配置基本Filter了,来学学如何定制Filter过滤器
创始人
2024-01-21 16:57:58
0

文章目录

  • 学习SpringCloud Gateway
  • 自定义全局Filter(GlobalFilter)
  • ServerWebExchange
  • 自定义非全局Filter(GatewayFilter)

学习SpringCloud Gateway

SpringCloud Gateway使用及原理分析大全——断言及过滤器(上篇)
SpringCloud Gateway使用及原理分析大全(下篇)

自定义全局Filter(GlobalFilter)


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.MediaType;
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.nio.charset.StandardCharsets;/*** 作为一个Bean放在容器中即可生效* * 注意:Gateway只支持响应式,所有的语法都需要使用响应式的语法*/
@Component
public class MyFilter implements GlobalFilter, Ordered {public static final Logger logger = LoggerFactory.getLogger(SessionIdFilter.class);@Overridepublic Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {// exchange可以获取到http请求的所有东西HttpHeaders headers = exchange.getRequest().getHeaders();String uname = exchange.getRequest().getQueryParams().getFirst("uname");if(headers == null){// 可以手动写回请求,直接拦截住不放行ServerHttpResponse response = exchange.getResponse();String errorInfo = "{\"code\": 401,\"success\": false}";DataBuffer buffer = response.bufferFactory().wrap(errorInfo.getBytes(StandardCharsets.UTF_8));response.setStatusCode(HttpStatus.UNAUTHORIZED);response.getHeaders().set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);// 注意,这里如果不需要写信息的话,可以直接return response.setComplete();return response.writeWith(Mono.just(buffer));}// 放行,进入下一个拦截器链return chain.filter(exchange);}/*** 优先级顺序,数字越小优先级越高*/@Overridepublic int getOrder() {return Integer.MIN_VALUE;}}

ServerWebExchange

ServerWebExchange是一个响应式接口类,它提供对HTTP请求和响应的访问,还公开其他与服务器端处理相关的属性和特性,如请求属性。

在这里,你几乎可以拿到所有的请求属性和响应。
在这里插入图片描述

自定义非全局Filter(GatewayFilter)

其实,GatewayFilter和GlobalFilter用法是一样的,但是GatewayFilter只能用于限定的路由,比如说可以这样用:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder, MyFilter filter) {return builder.routes().route(r -> r.host("**.abc.org").and().path("/image/png").filters(f ->f.filter(filter)) // 此处定义GatewayFilter,不能用GlobalFilter.uri("http://httpbin.org:80")).build();
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...