过滤器获取service方法返回慢_Gateway:自定义过滤器
自定義局部過濾器
需求:在application.yml中對(duì)某個(gè)路由配置過濾器,該過濾器可以在控制臺(tái)輸出配置文件中指定名稱的請(qǐng)求參數(shù)的值。
在gateway-server模塊中編寫過濾器工廠類MyParamGatewayFilterFactory
package?com.icoding.filter;import?org.springframework.cloud.gateway.filter.GatewayFilter;
import?org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import?org.springframework.http.server.reactive.ServerHttpRequest;
import?org.springframework.stereotype.Component;
import?java.util.Arrays;
import?java.util.List;
/**?自定義局部過濾器?*/
@Component
public?class?MyParamGatewayFilterFactory?extends
????????AbstractGatewayFilterFactory?{
????private?static?final?String?PARAM_KEY?=?"param";
????/**?定義構(gòu)造器(必須)?*/
????public?MyParamGatewayFilterFactory(){
????????super(Config.class);
????}
????/**?接收過濾器傳進(jìn)來(lái)的字段集合(可選)?*/
????@Override
????public?List?shortcutFieldOrder()?{return?Arrays.asList(PARAM_KEY);
????}
????/**?重寫攔截方法(必須)?*/
????@Override
????public?GatewayFilter?apply(Config?config)?{return?(exchange,?chain)?->?{
????????????//?獲取請(qǐng)求對(duì)象
????????????ServerHttpRequest?request?=?exchange.getRequest();
????????????//?獲取請(qǐng)求參數(shù)?http://localhost:10010/api/user/get/2?name=zhangsan&age=30if?(request.getQueryParams().containsKey(config.param)){
????????????????request.getQueryParams().get(config.param).forEach(value?->?{
????????????????????System.out.println(config.param?+?"?=?"?+?value);
????????????????});
????????????}
????????????//?放行return?chain.filter(exchange);
????????};
????}
????/**?定義配置類,接收配置文件中的屬性(必須)?*/
????public?static?class?Config?{
????????private?String?param;
????????public?String?getParam()?{return?param;
????????}
????????public?void?setParam(String?param)?{
????????????this.param?=?param;
????????}
????}
}
在gateway-server模塊中修改application.yml配置文件
package?com.icoding.filter;import?org.springframework.cloud.gateway.filter.GatewayFilter;
import?org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import?org.springframework.http.server.reactive.ServerHttpRequest;
import?org.springframework.stereotype.Component;
import?java.util.Arrays;
import?java.util.List;
/**?自定義局部過濾器?*/
@Component
public?class?MyParamGatewayFilterFactory?extends
????????AbstractGatewayFilterFactory?{
????private?static?final?String?PARAM_KEY?=?"param";
????/**?定義構(gòu)造器(必須)?*/
????public?MyParamGatewayFilterFactory(){
????????super(Config.class);
????}
????/**?接收過濾器傳進(jìn)來(lái)的字段集合(可選)?*/
????@Override
????public?List?shortcutFieldOrder()?{return?Arrays.asList(PARAM_KEY);
????}
????/**?重寫攔截方法(必須)?*/
????@Override
????public?GatewayFilter?apply(Config?config)?{return?(exchange,?chain)?->?{
????????????//?獲取請(qǐng)求對(duì)象
????????????ServerHttpRequest?request?=?exchange.getRequest();
????????????//?獲取請(qǐng)求參數(shù)?http://localhost:10010/api/user/get/2?name=zhangsan&age=30if?(request.getQueryParams().containsKey(config.param)){
????????????????request.getQueryParams().get(config.param).forEach(value?->?{
????????????????????System.out.println(config.param?+?"?=?"?+?value);
????????????????});
????????????}
????????????//?放行return?chain.filter(exchange);
????????};
????}
????/**?定義配置類,接收配置文件中的屬性(必須)?*/
????public?static?class?Config?{
????????private?String?param;
????????public?String?getParam()?{return?param;
????????}
????????public?void?setParam(String?param)?{
????????????this.param?=?param;
????????}
????}
}server:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認(rèn)過濾器,對(duì)所有路由生效
??????default-filters:#?添加響應(yīng)頭過濾器,添加一個(gè)響應(yīng)頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務(wù)地址;lb表示負(fù)載均衡(從eureka中獲取具體服務(wù))
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個(gè)路徑,2表示兩個(gè)路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
??????defaultZone:?http://localhost:8761/eureka,http://localhost:8762/eurekaserver:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認(rèn)過濾器,對(duì)所有路由生效
??????default-filters:#?添加響應(yīng)頭過濾器,添加一個(gè)響應(yīng)頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務(wù)地址;lb表示負(fù)載均衡(從eureka中獲取具體服務(wù))
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個(gè)路徑,2表示兩個(gè)路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
??????defaultZone:?http://localhost:8761/eureka,http://localhost:8762/eureka
測(cè)試訪問
http://localhost:10010/api/user/1?name=admin 檢查后臺(tái)是否輸出name和admin
http://localhost:10010/api/user/1?name2=admin 則是不會(huì)輸出的。
自定義全局過濾器
需求:模擬一個(gè)登錄的校驗(yàn)。基本邏輯:如果請(qǐng)求中有token參數(shù),則認(rèn)為請(qǐng)求有效,放行。
在gateway-server模塊中編寫全局過濾器類MyGlobalFilter
課堂代碼:
package?com.icoding.filter;import?org.springframework.cloud.gateway.filter.GatewayFilter;
import?org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import?org.springframework.http.server.reactive.ServerHttpRequest;
import?org.springframework.stereotype.Component;
import?java.util.Arrays;
import?java.util.List;
/**?自定義局部過濾器?*/
@Component
public?class?MyParamGatewayFilterFactory?extends
????????AbstractGatewayFilterFactory?{
????private?static?final?String?PARAM_KEY?=?"param";
????/**?定義構(gòu)造器(必須)?*/
????public?MyParamGatewayFilterFactory(){
????????super(Config.class);
????}
????/**?接收過濾器傳進(jìn)來(lái)的字段集合(可選)?*/
????@Override
????public?List?shortcutFieldOrder()?{return?Arrays.asList(PARAM_KEY);
????}
????/**?重寫攔截方法(必須)?*/
????@Override
????public?GatewayFilter?apply(Config?config)?{return?(exchange,?chain)?->?{
????????????//?獲取請(qǐng)求對(duì)象
????????????ServerHttpRequest?request?=?exchange.getRequest();
????????????//?獲取請(qǐng)求參數(shù)?http://localhost:10010/api/user/get/2?name=zhangsan&age=30if?(request.getQueryParams().containsKey(config.param)){
????????????????request.getQueryParams().get(config.param).forEach(value?->?{
????????????????????System.out.println(config.param?+?"?=?"?+?value);
????????????????});
????????????}
????????????//?放行return?chain.filter(exchange);
????????};
????}
????/**?定義配置類,接收配置文件中的屬性(必須)?*/
????public?static?class?Config?{
????????private?String?param;
????????public?String?getParam()?{return?param;
????????}
????????public?void?setParam(String?param)?{
????????????this.param?=?param;
????????}
????}
}server:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認(rèn)過濾器,對(duì)所有路由生效
??????default-filters:#?添加響應(yīng)頭過濾器,添加一個(gè)響應(yīng)頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務(wù)地址;lb表示負(fù)載均衡(從eureka中獲取具體服務(wù))
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個(gè)路徑,2表示兩個(gè)路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
??????defaultZone:?http://localhost:8761/eureka,http://localhost:8762/eurekaserver:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認(rèn)過濾器,對(duì)所有路由生效
??????default-filters:#?添加響應(yīng)頭過濾器,添加一個(gè)響應(yīng)頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務(wù)地址;lb表示負(fù)載均衡(從eureka中獲取具體服務(wù))
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個(gè)路徑,2表示兩個(gè)路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
????? defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekapackage com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;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;/**?*?全局過濾器?*/????@Component//?@Order(1)????:? Ordered這個(gè)接口也可以使用注解來(lái)排序public class MyGlobalFilter implements GlobalFilter, Ordered {????/*如果你有token就讓他們?cè)L問,如果沒有token,不讓訪問*/????@Override ?? public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)?{??????? System.out.println("全局過濾器執(zhí)行了。。。。。。。");????????//獲取參數(shù)????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");????????/*????????*??String?aa?=?"";????????*??String?bb?=?"??????????";????????*??String?cc?=?null;????????*????????*???如果是isBlank?都是返回true????????*????????*?*/????????if(StringUtils.isBlank(token)){????????????//為空,token沒有值,阻止往下執(zhí)行??????????? exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);?//設(shè)置返回的狀態(tài)碼????????????//不會(huì)繼續(xù)往下執(zhí)行了!????????????return?exchange.getResponse().setComplete();????????}????????//放行????????return?chain.filter(exchange);????}????/*數(shù)值越小越先執(zhí)行*/????@Override????public?int?getOrder()?{????????return?5;????}}package com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;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;/**?*?全局過濾器?*/????@Component//?@Order(1)????:? Ordered這個(gè)接口也可以使用注解來(lái)排序public class MyGlobalFilter implements GlobalFilter, Ordered {????/*如果你有token就讓他們?cè)L問,如果沒有token,不讓訪問*/????@Override ?? public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)?{??????? System.out.println("全局過濾器執(zhí)行了。。。。。。。");????????//獲取參數(shù)????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");????????/*????????*??String?aa?=?"";????????*??String?bb?=?"??????????";????????*??String?cc?=?null;????????*????????*???如果是isBlank?都是返回true????????*????????*?*/????????if(StringUtils.isBlank(token)){????????????//為空,token沒有值,阻止往下執(zhí)行??????????? exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);?//設(shè)置返回的狀態(tài)碼????????????//不會(huì)繼續(xù)往下執(zhí)行了!????????????return?exchange.getResponse().setComplete();????????}????????//放行????????return?chain.filter(exchange);????}????/*數(shù)值越小越先執(zhí)行*/????@Override????public?int?getOrder()?{????????return?5;????}}package?com.icoding.filter;
import?org.springframework.cloud.gateway.filter.GatewayFilter;
import?org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import?org.springframework.http.server.reactive.ServerHttpRequest;
import?org.springframework.stereotype.Component;
import?java.util.Arrays;
import?java.util.List;
/**?自定義局部過濾器?*/
@Component
public?class?MyParamGatewayFilterFactory?extends
????????AbstractGatewayFilterFactory?{
????private?static?final?String?PARAM_KEY?=?"param";
????/**?定義構(gòu)造器(必須)?*/
????public?MyParamGatewayFilterFactory(){
????????super(Config.class);
????}
????/**?接收過濾器傳進(jìn)來(lái)的字段集合(可選)?*/
????@Override
????public?List?shortcutFieldOrder()?{return?Arrays.asList(PARAM_KEY);
????}
????/**?重寫攔截方法(必須)?*/
????@Override
????public?GatewayFilter?apply(Config?config)?{return?(exchange,?chain)?->?{
????????????//?獲取請(qǐng)求對(duì)象
????????????ServerHttpRequest?request?=?exchange.getRequest();
????????????//?獲取請(qǐng)求參數(shù)?http://localhost:10010/api/user/get/2?name=zhangsan&age=30if?(request.getQueryParams().containsKey(config.param)){
????????????????request.getQueryParams().get(config.param).forEach(value?->?{
????????????????????System.out.println(config.param?+?"?=?"?+?value);
????????????????});
????????????}
????????????//?放行return?chain.filter(exchange);
????????};
????}
????/**?定義配置類,接收配置文件中的屬性(必須)?*/
????public?static?class?Config?{
????????private?String?param;
????????public?String?getParam()?{return?param;
????????}
????????public?void?setParam(String?param)?{
????????????this.param?=?param;
????????}
????}
}server:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認(rèn)過濾器,對(duì)所有路由生效
??????default-filters:#?添加響應(yīng)頭過濾器,添加一個(gè)響應(yīng)頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務(wù)地址;lb表示負(fù)載均衡(從eureka中獲取具體服務(wù))
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個(gè)路徑,2表示兩個(gè)路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
??????defaultZone:?http://localhost:8761/eureka,http://localhost:8762/eurekaserver:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認(rèn)過濾器,對(duì)所有路由生效
??????default-filters:#?添加響應(yīng)頭過濾器,添加一個(gè)響應(yīng)頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務(wù)地址;lb表示負(fù)載均衡(從eureka中獲取具體服務(wù))
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個(gè)路徑,2表示兩個(gè)路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
????? defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekapackage com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;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;/**?*?全局過濾器?*/????@Component//?@Order(1)????:? Ordered這個(gè)接口也可以使用注解來(lái)排序public class MyGlobalFilter implements GlobalFilter, Ordered {????/*如果你有token就讓他們?cè)L問,如果沒有token,不讓訪問*/????@Override ?? public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)?{??????? System.out.println("全局過濾器執(zhí)行了。。。。。。。");????????//獲取參數(shù)????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");????????/*????????*??String?aa?=?"";????????*??String?bb?=?"??????????";????????*??String?cc?=?null;????????*????????*???如果是isBlank?都是返回true????????*????????*?*/????????if(StringUtils.isBlank(token)){????????????//為空,token沒有值,阻止往下執(zhí)行??????????? exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);?//設(shè)置返回的狀態(tài)碼????????????//不會(huì)繼續(xù)往下執(zhí)行了!????????????return?exchange.getResponse().setComplete();????????}????????//放行????????return?chain.filter(exchange);????}????/*數(shù)值越小越先執(zhí)行*/????@Override????public?int?getOrder()?{????????return?5;????}}package com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;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;/**?*?全局過濾器?*/????@Component//?@Order(1)????:? Ordered這個(gè)接口也可以使用注解來(lái)排序public class MyGlobalFilter implements GlobalFilter, Ordered {????/*如果你有token就讓他們?cè)L問,如果沒有token,不讓訪問*/????@Override ?? public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)?{??????? System.out.println("全局過濾器執(zhí)行了。。。。。。。");????????//獲取參數(shù)????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");????????/*????????*??String?aa?=?"";????????*??String?bb?=?"??????????";????????*??String?cc?=?null;????????*????????*???如果是isBlank?都是返回true????????*????????*?*/????????if(StringUtils.isBlank(token)){????????????//為空,token沒有值,阻止往下執(zhí)行??????????? exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);?//設(shè)置返回的狀態(tài)碼????????????//不會(huì)繼續(xù)往下執(zhí)行了!????????????return?exchange.getResponse().setComplete();????????}????????//放行????????return?chain.filter(exchange);????}????/*數(shù)值越小越先執(zhí)行*/????@Override????public?int?getOrder()?{????????return?5;????}}package?com.icoding.filter;
import?org.apache.commons.lang.StringUtils;
import?org.springframework.cloud.gateway.filter.GatewayFilterChain;
import?org.springframework.cloud.gateway.filter.GlobalFilter;
import?org.springframework.core.Ordered;
import?org.springframework.http.HttpStatus;
import?org.springframework.stereotype.Component;
import?org.springframework.web.server.ServerWebExchange;
import?reactor.core.publisher.Mono;
/**?自定義全局過濾器?*/
@Component
public?class?MyGlobalFilter?implements?GlobalFilter,?Ordered?{
????@Override
????public?Mono?filter(ServerWebExchange?exchange,?GatewayFilterChain?chain)?{
????????System.out.println("==全局過濾器MyGlobalFilter==");
????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");if?(StringUtils.isBlank(token)){
????????????//?設(shè)置響應(yīng)狀態(tài)碼:?401?未授權(quán)
????????????exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
????????????//?返回響應(yīng)完成return?exchange.getResponse().setComplete();
????????}
????????//?放行return?chain.filter(exchange);
????}
????@Override
????public?int?getOrder()?{
????????//?值越小越先執(zhí)行return?1;
????}
package?com.icoding.filter;
import?org.apache.commons.lang.StringUtils;
import?org.springframework.cloud.gateway.filter.GatewayFilterChain;
import?org.springframework.cloud.gateway.filter.GlobalFilter;
import?org.springframework.core.Ordered;
import?org.springframework.http.HttpStatus;
import?org.springframework.stereotype.Component;
import?org.springframework.web.server.ServerWebExchange;
import?reactor.core.publisher.Mono;
/**?自定義全局過濾器?*/
@Component
public?class?MyGlobalFilter?implements?GlobalFilter,?Ordered?{
????@Override
????public?Mono?filter(ServerWebExchange?exchange,?GatewayFilterChain?chain)?{
????????System.out.println("==全局過濾器MyGlobalFilter==");
????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");if?(StringUtils.isBlank(token)){
????????????//?設(shè)置響應(yīng)狀態(tài)碼:?401?未授權(quán)
????????????exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
????????????//?返回響應(yīng)完成return?exchange.getResponse().setComplete();
????????}
????????//?放行return?chain.filter(exchange);
????}
????@Override
????public?int?getOrder()?{
????????//?值越小越先執(zhí)行return?1;
????}
測(cè)試訪問
訪問 http://localhost:10010/api/user/1
訪問 http://localhost:10010/api/user/1?token=admin
回復(fù)關(guān)鍵詞
?JUC????分布式限流???消息隊(duì)列???alibaba????JVM性能調(diào)優(yōu)????
看更多精彩教程
別忘了點(diǎn)個(gè)在看哦!轉(zhuǎn)發(fā)那就太好了!
總結(jié)
以上是生活随笔為你收集整理的过滤器获取service方法返回慢_Gateway:自定义过滤器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打印机打印网页不清晰_打印机墨水:你不知
- 下一篇: 动态规划立体匹配代码_411,动态规划和