过滤器获取service方法返回慢_Gateway:自定义过滤器
自定义局部过滤器
需求:在application.yml中对某个路由配置过滤器,该过滤器可以在控制台输出配置文件中指定名称的请求参数的值。
在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;
/** 自定义局部过滤器 */@Componentpublic class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory { private static final String PARAM_KEY = "param"; /** 定义构造器(必须) */ public MyParamGatewayFilterFactory(){ super(Config.class); } /** 接收过滤器传进来的字段集合(可选) */ @Override public List shortcutFieldOrder() {return Arrays.asList(PARAM_KEY); } /** 重写拦截方法(必须) */ @Override public GatewayFilter apply(Config config) {return (exchange, chain) -> { // 获取请求对象 ServerHttpRequest request = exchange.getRequest(); // 获取请求参数 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;
/** 自定义局部过滤器 */@Componentpublic class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory { private static final String PARAM_KEY = "param"; /** 定义构造器(必须) */ public MyParamGatewayFilterFactory(){ super(Config.class); } /** 接收过滤器传进来的字段集合(可选) */ @Override public List shortcutFieldOrder() {return Arrays.asList(PARAM_KEY); } /** 重写拦截方法(必须) */ @Override public GatewayFilter apply(Config config) {return (exchange, chain) -> { // 获取请求对象 ServerHttpRequest request = exchange.getRequest(); // 获取请求参数 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: 10010spring: application: name: api-gateway cloud: gateway:# 默认过滤器,对所有路由生效 default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin - AddResponseHeader=name,admin routes:# 路由id,可以随意写 - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务) uri: lb://user-service# 路由断言,可以配置映射路径 predicates: - Path=/api/user/** filters:# 表示过滤1个路径,2表示两个路径,以此类推 - StripPrefix=1# 自定义过滤器 - MyParam=nameeureka: client: service-url: defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekaserver: port: 10010spring: application: name: api-gateway cloud: gateway:# 默认过滤器,对所有路由生效 default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin - AddResponseHeader=name,admin routes:# 路由id,可以随意写 - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务) uri: lb://user-service# 路由断言,可以配置映射路径 predicates: - Path=/api/user/** filters:# 表示过滤1个路径,2表示两个路径,以此类推 - StripPrefix=1# 自定义过滤器 - MyParam=nameeureka: client: service-url: defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka
测试访问
http://localhost:10010/api/user/1?name=admin 检查后台是否输出name和admin
http://localhost:10010/api/user/1?name2=admin 则是不会输出的。
自定义全局过滤器
需求:模拟一个登录的校验。基本逻辑:如果请求中有token参数,则认为请求有效,放行。
在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;
/** 自定义局部过滤器 */@Componentpublic class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory { private static final String PARAM_KEY = "param"; /** 定义构造器(必须) */ public MyParamGatewayFilterFactory(){ super(Config.class); } /** 接收过滤器传进来的字段集合(可选) */ @Override public List shortcutFieldOrder() {return Arrays.asList(PARAM_KEY); } /** 重写拦截方法(必须) */ @Override public GatewayFilter apply(Config config) {return (exchange, chain) -> { // 获取请求对象 ServerHttpRequest request = exchange.getRequest(); // 获取请求参数 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: 10010spring: application: name: api-gateway cloud: gateway:# 默认过滤器,对所有路由生效 default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin - AddResponseHeader=name,admin routes:# 路由id,可以随意写 - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务) uri: lb://user-service# 路由断言,可以配置映射路径 predicates: - Path=/api/user/** filters:# 表示过滤1个路径,2表示两个路径,以此类推 - StripPrefix=1# 自定义过滤器 - MyParam=nameeureka: client: service-url: defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekaserver: port: 10010spring: application: name: api-gateway cloud: gateway:# 默认过滤器,对所有路由生效 default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin - AddResponseHeader=name,admin routes:# 路由id,可以随意写 - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务) uri: lb://user-service# 路由断言,可以配置映射路径 predicates: - Path=/api/user/** filters:# 表示过滤1个路径,2表示两个路径,以此类推 - StripPrefix=1# 自定义过滤器 - MyParam=nameeureka: 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这个接口也可以使用注解来排序public class MyGlobalFilter implements GlobalFilter, Ordered { /*如果你有token就让他们访问,如果没有token,不让访问*/ @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("全局过滤器执行了。。。。。。。"); //获取参数 String token = exchange.getRequest().getQueryParams().getFirst("token"); /* * String aa = ""; * String bb = " "; * String cc = null; * * 如果是isBlank 都是返回true * * */ if(StringUtils.isBlank(token)){ //为空,token没有值,阻止往下执行 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置返回的状态码 //不会继续往下执行了! return exchange.getResponse().setComplete(); } //放行 return chain.filter(exchange); } /*数值越小越先执行*/ @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这个接口也可以使用注解来排序public class MyGlobalFilter implements GlobalFilter, Ordered { /*如果你有token就让他们访问,如果没有token,不让访问*/ @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("全局过滤器执行了。。。。。。。"); //获取参数 String token = exchange.getRequest().getQueryParams().getFirst("token"); /* * String aa = ""; * String bb = " "; * String cc = null; * * 如果是isBlank 都是返回true * * */ if(StringUtils.isBlank(token)){ //为空,token没有值,阻止往下执行 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置返回的状态码 //不会继续往下执行了! return exchange.getResponse().setComplete(); } //放行 return chain.filter(exchange); } /*数值越小越先执行*/ @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;
/** 自定义局部过滤器 */@Componentpublic class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory { private static final String PARAM_KEY = "param"; /** 定义构造器(必须) */ public MyParamGatewayFilterFactory(){ super(Config.class); } /** 接收过滤器传进来的字段集合(可选) */ @Override public List shortcutFieldOrder() {return Arrays.asList(PARAM_KEY); } /** 重写拦截方法(必须) */ @Override public GatewayFilter apply(Config config) {return (exchange, chain) -> { // 获取请求对象 ServerHttpRequest request = exchange.getRequest(); // 获取请求参数 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: 10010spring: application: name: api-gateway cloud: gateway:# 默认过滤器,对所有路由生效 default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin - AddResponseHeader=name,admin routes:# 路由id,可以随意写 - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务) uri: lb://user-service# 路由断言,可以配置映射路径 predicates: - Path=/api/user/** filters:# 表示过滤1个路径,2表示两个路径,以此类推 - StripPrefix=1# 自定义过滤器 - MyParam=nameeureka: client: service-url: defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekaserver: port: 10010spring: application: name: api-gateway cloud: gateway:# 默认过滤器,对所有路由生效 default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin - AddResponseHeader=name,admin routes:# 路由id,可以随意写 - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务) uri: lb://user-service# 路由断言,可以配置映射路径 predicates: - Path=/api/user/** filters:# 表示过滤1个路径,2表示两个路径,以此类推 - StripPrefix=1# 自定义过滤器 - MyParam=nameeureka: 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这个接口也可以使用注解来排序public class MyGlobalFilter implements GlobalFilter, Ordered { /*如果你有token就让他们访问,如果没有token,不让访问*/ @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("全局过滤器执行了。。。。。。。"); //获取参数 String token = exchange.getRequest().getQueryParams().getFirst("token"); /* * String aa = ""; * String bb = " "; * String cc = null; * * 如果是isBlank 都是返回true * * */ if(StringUtils.isBlank(token)){ //为空,token没有值,阻止往下执行 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置返回的状态码 //不会继续往下执行了! return exchange.getResponse().setComplete(); } //放行 return chain.filter(exchange); } /*数值越小越先执行*/ @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这个接口也可以使用注解来排序public class MyGlobalFilter implements GlobalFilter, Ordered { /*如果你有token就让他们访问,如果没有token,不让访问*/ @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("全局过滤器执行了。。。。。。。"); //获取参数 String token = exchange.getRequest().getQueryParams().getFirst("token"); /* * String aa = ""; * String bb = " "; * String cc = null; * * 如果是isBlank 都是返回true * * */ if(StringUtils.isBlank(token)){ //为空,token没有值,阻止往下执行 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置返回的状态码 //不会继续往下执行了! return exchange.getResponse().setComplete(); } //放行 return chain.filter(exchange); } /*数值越小越先执行*/ @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;/** 自定义全局过滤器 */@Componentpublic 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)){ // 设置响应状态码: 401 未授权 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); // 返回响应完成return exchange.getResponse().setComplete(); } // 放行return chain.filter(exchange); } @Override public int getOrder() { // 值越小越先执行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;/** 自定义全局过滤器 */@Componentpublic 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)){ // 设置响应状态码: 401 未授权 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); // 返回响应完成return exchange.getResponse().setComplete(); } // 放行return chain.filter(exchange); } @Override public int getOrder() { // 值越小越先执行return 1; }
测试访问
访问 http://localhost:10010/api/user/1
访问 http://localhost:10010/api/user/1?token=admin
回复关键词
JUC 分布式限流 消息队列 alibaba JVM性能调优
看更多精彩教程
别忘了点个在看哦!转发那就太好了!
过滤器获取service方法返回慢_Gateway:自定义过滤器相关推荐
- 过滤器获取service方法返回慢_Spring Cloud Gateway-全局过滤器(Global Filters)
TIPS本文基于Spring Cloud Gateway SR2,理论适配Spring Cloud Gateway SR1以及更高版本. 本文详细探讨Spring Cloud Gateway内置的全局 ...
- asp.net MVC之 自定义过滤器(Filter)
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...
- MVC之 自定义过滤器(ActionFilterAttribute)
一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttribute类的方法签名. //表示所有操作 ...
- 使用adblock的高级自定义过滤器, 来过滤包含特定文字的html元素
需求: 想用adblock 过滤一个div窗体, 该窗体的特征是其子元素包含指定的文字. 解决方法: 使用adblock的 Snippet 过滤器语法. snippet 命令 hide-if- ...
- ThinkPHP6.0使用twig作为模板引擎及自定义过滤器
ThinkPHP自带的模板引擎用起来很不顺手,好在找到了一个和Jinja2很类似的一个一个模板引擎Twig,可以集成到ThinkPHP中. 文档: https://github.com/yunwuxi ...
- 09_Filter过滤器(访问所有资源前,首先执行自定义过滤器类的doFilter方法)_Listener监听器(监听域对象的改变)
Filter 什么是Web过滤器? 如何使用Filter过滤器? 自定义Filter类的生命周期 过滤器可以拦截哪些资源路径? 拦截方式配置:资源被访问的方式 过滤器链的默认执行顺序是什么? 如何配置 ...
- 关于将struts2框架下,使自定义过滤器对部分的action(一个action或多个action)请求忽略的方法
关于将struts2框架下,使自定义过滤器对部分的action请求忽略的方法 首先需要了解一个方法 request.getServletPath() 他将返回一个当前请求的路径的醉详细名称 例如对路径 ...
- 统计文件种类数+获取子shell返回值的其它方法
前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...
- ajax返回值并在layui显示,layUI使用layer.open,在content打开数据表格,获取值并返回的方法...
在layUI编写的页面中,遇到这么一种情况,从一个页面中使用layer.open打开一个新窗口,新窗口中是一个数据表格,现在需要选中数据表格中的一列并获取它的值,以便下面这个选择按钮可以使用这个值进行 ...
最新文章
- Mysql高级调优篇——前言简介
- 【树形DP】树的重心详解+多组例题详解
- php tp 查数据库数据一条_PHP自学(六)TP框架进行数据库查询
- ORACLE会话数、连接数配置
- 生成器模式 - 让配置代码更优雅
- 中南民族大学计算机类有什么具体专业,中南民族大学计算机科学学院计算机科学与技术专业简介...
- hdu_5761_Rower Bo(xjb猜公式)
- 刚装了fedora 17,装机必备,解决视频格式和中文输入法。
- PHP array_map()
- 前端进阶之防抖与节流是什么?
- 第一章python绝对温标身体质量指数bmi
- CodeForces 706A Beru-taxi
- 如何为新建网站选择好的域名
- 浏览器访问一个地址的大概操作步骤
- 190517每日一句
- 程序员技能与成长:程序员的必备工具箱(值得收藏)
- Google可能将退出中国市场
- android fsck_msdos 分析(二)
- survival | 生存分析(3):生存曲线(下)
- 机器视觉实用工具集NO.16——指定监控区域运动物体闯入检测工具
热门文章
- UVM基础之------uvm_port_base
- php的yii框架开发总结2
- 使用css的类名交集复合选择器
- Heartbeat,来点真的
- [导入]DotNet软件开发框架
- Some best freeware
- inet_aton和inet_network和inet_addr三者比较-《别怕Linux编程》之五
- dingo php,用laravel dingo/api创建简单的api
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和static