浙江建设,长沙优化网站建设,制作网页如何设置对齐方式,国内软件开发一、全局过滤器 全局过滤器的作用也是处理一切进入网关的请求和微服务响应#xff0c;与GatewayFilter的作用一样。 区别在于GatewayFilter通过配置定义#xff0c;处理逻辑是固定的#xff0c;如果我们希望拦截请求#xff0c;做自己的业务逻辑则没办法实现。而GlobalFilt…一、全局过滤器 全局过滤器的作用也是处理一切进入网关的请求和微服务响应与GatewayFilter的作用一样。 区别在于GatewayFilter通过配置定义处理逻辑是固定的如果我们希望拦截请求做自己的业务逻辑则没办法实现。而GlobalFilter的逻辑需要自己写代码实现。 定义方式是实现GlobalFilter接口。
public interface GlobalFilter {/*** 处理当前请求有必要的话通过{link GatewayFilterChain}将请求交给下一个过滤器处理** param exchange 请求上下文里面可以获取Request、Response等信息* param chain 用来把请求委托给下一个过滤器 * return {code MonoVoid} 返回标示当前过滤器业务结束*/MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
在filter中编写自定义逻辑可以实现下列功能
- 登录状态判断 - 权限校验 - 请求限流等 示例判断拦截用户身份请求参数是否含有authorizationauthorization参数值是否为admin如果同时满足则放行否则拦截。 实现全局过滤器的步骤 步骤一、在gateway中定义一个过滤器新建 AuthorizeFilter类实现GlobalFilter接口 步骤二、添加Order注解或实现Ordered接口添加Component注解 步骤三、编写处理逻辑
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;Order(-1)
Component
public class AuthorizeFilter implements GlobalFilter {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求参数MultiValueMapString, 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();}
}
访问测试localhost:10010/user/1? authorizationadmin1成功拦截。 全局过滤器的作用对所有路由都生效的过滤器并且可以自定义处理逻辑。
二、过滤器执行顺序
请求进入网关会碰到三类过滤器当前路由的过滤器、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排序组织过滤器链。
路由过滤器、defaultFilter、全局过滤器的执行顺序 1.order值越小优先级越高 2.当order值一样时顺序是defaultFilter最先然后是局部的路由过滤器最后是全局过滤器
三、网关的cors跨域配置
跨域域名不一致就是跨域主要包括 域名不同 www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com 域名相同端口不同localhost:8080和localhost8081 跨域问题浏览器禁止请求的发起者与服务端发生跨域ajax请求请求被浏览器拦截的问题
解决方案CORS
跨域示例localhost:8090访问localhost:10010端口不同显然是跨域的请求。 解决方案
步骤一、
在gateway服务的application.yml文件中添加下面的配置
spring:cloud:gateway:globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:[/**]:allowedOrigins: # 允许哪些网站的跨域请求 - http://localhost:8090allowedMethods: # 允许的跨域ajax的请求方式- GET- POST- DELETE- PUT- OPTIONSallowedHeaders: * # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期
步骤二、
重启测试 成功跨域访问http://localhost:10010/user/1? authorizationadmin。
四、限流算法
限流对应用服务器的请求做限制避免因过多请求而导致服务器过载甚至宕机。限流算法常见的包括 计数器算法又包括窗口计数器算法、滑动窗口计数器算法 漏桶算法(Leaky Bucket) 令牌桶算法Token Bucket