前言:
最近在学习微服务相关的知识,看了黑马的相关课程,将关于Gateway过滤器的知识又总结了一些,希望能帮到各位小伙儿们以及加深下自己的印象🎊
如果文章有什么需要改进的地方还请大佬多多指教🥂
小威先感谢大家的支持了😁
全局过滤器
Gateway网关的过滤器分为两种,一种是局部过滤器,一种是全局过滤器。
过滤器,顾名思义,就是过滤一些请求,在这里,全局过滤器的作用是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。
Gateway内部有一个接口 名为GlobalFilter,这个就是Gateway的全局过滤器接口,只要在应用中实现此接口后注册为Spring的Bean,它就会就会帮我们将这个实现注册到全局过滤器链条里边去。
定义方式是实现GlobalFilter接口。
publicinterfaceGlobalFilter{/**
* 处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
*
* @param exchange 请求上下文,里面可以获取Request、Response等信息
* @param chain 用来把请求委托给下一个过滤器
* @return {@code Mono<Void>} 返回标示当前过滤器业务结束
*/Mono<Void>filter(ServerWebExchange exchange,GatewayFilterChain chain);}
在filter中需要编写自定义逻辑,可以实现下列功能:登录状态判断,权限校验,请求限流等。
自定义全局过滤器
如果需要判断参数中是否有authorization,authorization参数值是否为admin应如何做呢,以下为Gateway的实现过滤器代码:
importorg.springframework.cloud.gateway.filter.GatewayFilterChain;importorg.springframework.cloud.gateway.filter.GlobalFilter;importorg.springframework.core.annotation.Order;importorg.springframework.http.HttpStatus;importorg.springframework.stereotype.Component;importorg.springframework.web.server.ServerWebExchange;importreactor.core.publisher.Mono;@Order(-1)@ComponentpublicclassAuthorizeFilterimplementsGlobalFilter{@OverridepublicMono<Void>filter(ServerWebExchange exchange,GatewayFilterChain chain){// 1.获取请求参数MultiValueMap<String,String> params = exchange.getRequest().getQueryParams();// 2.获取authorization参数String auth = params.getFirst("authorization");// 3.校验if("admin".equals(auth)){// 放行return chain.filter(exchange);}// 4.拦截// 4.1.禁止访问,设置状态码
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);// 4.2.结束处理return exchange.getResponse().setComplete();}}
过滤器执行顺序
过滤器会被执行两次,过滤分为pre和post。
pre:请求前调用。
post:响应结果返回时调用,顺序和pre完全相反。
请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器:
排序规则如下:
每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。
org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()
方法是先加载defaultFilters,然后再加载某个route的filters,然后合并。
org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()
方法会加载全局过滤器,与前面的过滤器合并后根据order排序,组织过滤器链。
跨域问题
跨域问题就是浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题。
跨域配置
spring:cloud:gateway:# 。。。globalcors:# 全局的跨域处理add-to-simple-url-handler-mapping:true# 解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins:# 允许哪些网站的跨域请求 -"http://localhost:8090"allowedMethods:# 允许的跨域ajax的请求方式-"GET"-"POST"-"DELETE"-"PUT"-"OPTIONS"allowedHeaders:"*"# 允许在请求中携带的头信息allowCredentials:true# 是否允许携带cookiemaxAge:360000# 这次跨域检测的有效期
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论🍻
再次感谢各位小伙伴儿们的支持🤞
版权归原作者 小威要向诸佬学习呀 所有, 如有侵权,请联系我们删除。