当前位置: 首页 > news >正文

西安专题门户响应式网站建设谷歌网页版登录入口

西安专题门户响应式网站建设,谷歌网页版登录入口,设计个人网站,杭州定制网站一、Spring Cloud Gateway内置GatewayFilter 路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定路由。Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。 官网地址:https://docs.spring.io/spring-cloud-gateway…

一、Spring Cloud Gateway内置GatewayFilter

路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应路由过滤器的范围是特定路由Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。

官网地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

过滤器工厂作用参数
AddRequestHeader为原始请求添加HeaderHeader的名称及值
AddRequestParameter为原始请求添加请求参数参数名称及值
AddResponseHeader为原始响应添加HeaderHeader的名称及值
DedupeResponseHeader剔除响应头中重复的值需要去重的Header名称及去重策略
Hystrix为路由引入Hystrix的断路器保护HystrixCommand的名称
FallbackHeaders为fallbackUri的请求头中添加具体的异常信息Header的名称
PrefixPath为原始请求路径添加前缀前缀路径
PreserveHostHeader为请求添加一个preserveHostHeader=true 的属性,路由过滤器会检查该属性以决定是否要发送原始的Host
RequestRateLimiter用于对请求限流,限流算法为令牌桶keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus
RedirectTo将原始请求重定向到指定的URLhttp状态码及重定向的url
RemoveHopByHopHeadersFilter为原始请求删除IETF组织规定的一系列Header默认就会启用,可以通过配置指定仅删除哪些Header
RemoveRequestHeader为原始请求删除某个HeaderHeader名称
RemoveResponseHeader为原始响应删除某个HeaderHeader名称
RewritePath重写原始的请求路径原始路径正则表达式以及重写后路径的正则表达式
RewriteResponseHeader重写原始响应中的某个HeaderHeader名称、值的正则表达式,重写后的值
SaveSession在转发请求之前,强制执行WebSession::save操作
secureHeaders为原始响应添加一系列起安全作用的响应头无,支持修改这些安全响应头的值
SetPath修改原始的请求路径修改后的路径
SetResponseHeader修改原始响应中某个Header的值Header名称,修改后的值
SetStatus修改原始响应的状态码HTTP 状态码,可以是数字,也可以是字符串
StripPrefix用于截断原始请求的路径使用数字表示要截断的路径的数量
Retry针对不同的响应进行重试retries、statuses、methods、series
RequestSize设置允许接收最大请求包的大 小。如果请求包大小超过设置的值,则返回 413 Payload Too Large请求包大小,单位为字节,默认值为5M
ModifyRequestBody在转发请求之前修改原始请求体内容修改后的请求体内容
ModifyResponseBody修改原始响应体的内容修改后的响应体内容

二、DefaultFilter

添加DefaultFilter将其应用于所有路由,您可以使用spring.cloud.gateway.default-filters,此属性配置采用DefaultFilter列表。

spring:cloud:gateway:default-filters:- AddResponseHeader=X-Response-Default-Red, Default-Blue- StripPrefix=1

三、GlobalFilter

GlobalFilter接口与GatewayFilter接口具有相同特征。GlobalFilter是有条件地应用于所有路由的特殊过滤器。

Spring Cloud Gateway 内置的GatewayFilter
在这里插入图片描述
更多介绍请见官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters

以下为自定义GlobalFilter实现记录请求方状态及耗时:

ApiLoggingFilter.java

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.List;@Slf4j
public class ApiLoggingFilter implements GlobalFilter, Ordered {private static final String START_TIME = "startTime";private static final String X_REAL_IP = "X-Real-IP";// nginx需要配置@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {if (log.isDebugEnabled()) {String info = String.format("Method:{%s} Host:{%s} Path:{%s} Query:{%s}",exchange.getRequest().getMethod().name(), exchange.getRequest().getURI().getHost(),exchange.getRequest().getURI().getPath(), exchange.getRequest().getQueryParams());log.debug(info);}exchange.getAttributes().put(START_TIME, System.currentTimeMillis());return chain.filter(exchange).then(Mono.fromRunnable(() -> {Long startTime = exchange.getAttribute(START_TIME);if (startTime != null) {Long executeTime = (System.currentTimeMillis() - startTime);List<String> ips = exchange.getRequest().getHeaders().get(X_REAL_IP);String ip = ips != null ? ips.get(0) : exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();String api = exchange.getRequest().getURI().getRawPath();int code = 500;if (exchange.getResponse().getStatusCode() != null) {code = exchange.getResponse().getStatusCode().value();}// 当前仅记录日志,后续可以添加日志队列,来过滤请求慢的接口if (log.isDebugEnabled()) {log.debug("来自IP地址:{}的请求接口:{},响应状态码:{},请求耗时:{}ms", ip, api, code, executeTime);}}}));}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}}

配置使用ApiLoggingFilter

GatewayConfiguration.java

@Configuration(proxyBeanMethods = false)
public class GatewayConfiguration {@Beanpublic ApiLoggingFilter apiLoggingFilter() {return new ApiLoggingFilter();}
}

四、过滤器的执行顺序

请求进入网关会碰到三类过滤器:当前路由的过滤器DefaultFilterGlobalFilter

请求路由后,会将 当前路由过滤器DefaultFilterGlobalFilter,合并到一个过滤器链(集合)中,按org.springframework.core.Ordered接口排序,排序后依次执行每个过滤器

在这里插入图片描述
排序的规则是什么呢?

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定。
  • 路由过滤器defaultFilterorderSpring指定,默认是按照声明顺序从1递增。
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。
  • 传入的 HTTP 请求第一个过滤器具有最高优先级。
  • 传出的 HTTP 响应最后一个过滤器具有最高优先级。

详细内容,可以查看源码:

org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法是先加载defaultFilters,然后再加载某个routefilters,然后合并。

private List<GatewayFilter> getFilters(RouteDefinition routeDefinition) {List<GatewayFilter> filters = new ArrayList();if (!this.gatewayProperties.getDefaultFilters().isEmpty()) {filters.addAll(this.loadGatewayFilters(routeDefinition.getId(), new ArrayList(this.gatewayProperties.getDefaultFilters())));}if (!routeDefinition.getFilters().isEmpty()) {filters.addAll(this.loadGatewayFilters(routeDefinition.getId(), new ArrayList(routeDefinition.getFilters())));}AnnotationAwareOrderComparator.sort(filters);return filters;
}

org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()方法会加载全局过滤器,与前面的过滤器合并后根据order排序,组织过滤器链。

public Mono<Void> handle(ServerWebExchange exchange) {Route route = (Route)exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);List<GatewayFilter> gatewayFilters = route.getFilters();List<GatewayFilter> combined = new ArrayList(this.globalFilters);combined.addAll(gatewayFilters);AnnotationAwareOrderComparator.sort(combined);if (logger.isDebugEnabled()) {logger.debug("Sorted gatewayFilterFactories: " + combined);}return (new DefaultGatewayFilterChain(combined)).filter(exchange);
}
http://www.hkea.cn/news/236307/

相关文章:

  • 网站主页特效欣赏百度官网下载电脑版
  • php mysql开发网站开发任何小说都能搜到的软件
  • the7 wordpress主题宁波seo外包费用
  • 云南建筑培训网seo刷点击软件
  • 男女做暖网站h5页面制作平台
  • 可以做puzzle的网站百度关键词排名提升工具
  • 竞网网站建设南宁网站seo大概多少钱
  • 114黄页信息网宝鸡seo培训
  • 东南亚做棋牌网站挖掘爱站网
  • 中国工程建设招标网官方网站谷歌查询关键词的工具叫什么
  • wordpress管理员密码忘记成都seo招聘
  • 武汉企业建站系统模板下载官方正版百度
  • 上海做网站国际财经新闻
  • 用废旧盒子做家用物品网站seo排名工具
  • 企业铭做网站域名解析在线查询
  • 怎么注册自己的小程序网站优化分析
  • 荆州网站建设流程网站设计培训
  • 网站支付怎么做的seo职业技能培训班
  • 做csgo直播网站上海知名网站制作公司
  • 深圳住建局官方网站seo网站关键词优化快速官网
  • 网站建设需要php吗企业的互联网推广
  • 苏中建设集团官方网站电商软文广告经典案例
  • 网站开发需要什么开发工具代做百度首页排名价格
  • 北京网站设计多少钱微信引流推广
  • 网站建设实施背景分析百度指数里的资讯指数是什么
  • 小程序定制开发深圳公司网站的优化seo
  • 构建一个网站域名查询平台
  • 蚌埠网站关键词优化推广下载
  • 看房地产的app在哪看aso安卓优化
  • 网站与域名的区别扬州整站seo