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

Spring Cloud Alibaba Gateway全局token过滤、局部过滤访问时间超过50ms日志提示

文章目录

  • Spring Cloud Alibaba Gateway验证token
    • 在前篇的基础上加入依赖
    • 在filter包中创建tokenFilter
  • Spring Cloud Alibaba Gateway局部过滤
    • 1.继承AbstractGatewayFilterFactory
    • 2.仿照AddRequestHeaderGatewayFilterFactory

Spring Cloud Alibaba Gateway验证token

基础搭建
前篇

在前篇的基础上加入依赖

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.18</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

在filter包中创建tokenFilter

@Component
@Slf4j
public class TokenFilter implements GlobalFilter, Ordered {@Value("${token.key}")private String tokenKey;private static final String TOKEN = "token";@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//生成一个token
/*        Map<String, Object> map = new HashMap<>();map.put("id", 100);map.put("nickName", "张三");map.put("tel", "10086");map.put(JWT.EXPIRES_AT, System.currentTimeMillis() + 2 * 24 * 6 * 6 * 1000);String token1 = JWTUtil.createToken(map, tokenKey.getBytes());*/List<String> strings = exchange.getRequest().getHeaders().get(TOKEN);ServerHttpResponse response = exchange.getResponse();if (ObjectUtil.isEmpty(strings)) {log.debug("token为空,不予通行");response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}String token = strings.get(0);boolean verify = false;try {verify = JWTUtil.verify(token, tokenKey.getBytes(StandardCharsets.UTF_8));} catch (Exception ex) {log.error("出现错误{}", ex.getMessage());ex.printStackTrace();}if (!verify) {log.error("token不对,不要投机取巧");response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}JWTPayload payload = JWTUtil.parseToken(token).getPayload();log.info("通过,大大滴好!!");return chain.filter(exchange);}//配置第一顺位执行@Overridepublic int getOrder() {return 1;}
}

自行访问
在这里插入图片描述

Spring Cloud Alibaba Gateway局部过滤

1.继承AbstractGatewayFilterFactory

加入配置
spring.cloud.gateway.routes[0].filters[4] = LogTime=50

  • 这里配置的LogTime 与 类名前面的对应
  • AbstractNameValueGatewayFilterFactory可以仿照这个类写 进入ieda 两下shift
@Component
@Slf4j
public class LogTimeGatewayFilterFactory extends AbstractGatewayFilterFactory<LogTimeGatewayFilterFactory.Config> {private String TIMESPAN = "timeSpan";public LogTimeGatewayFilterFactory() {super(LogTimeGatewayFilterFactory.Config.class);}public List<String> shortcutFieldOrder() {return Arrays.asList(TIMESPAN);}@Overridepublic GatewayFilter apply(Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {long start = System.currentTimeMillis();exchange.getAttributes().put("start", start);return chain.filter(exchange).then(Mono.fromRunnable(()->{long end = System.currentTimeMillis();long start1 = exchange.getAttribute("start");HttpRequest request = exchange.getRequest();URI uri = request.getURI();if(config.timeSpan > (end - start1)){log.info("uri伟{}不错!{}在50ms之内",uri,end - start1);}log.info("uri伟{}不行!太慢啦{}",uri,end - start1);}));}};}@Validated//启用参数验证似乎public static class Config{private int timeSpan;public int getTimeSpan() {return timeSpan;}public void setTimeSpan(int timeSpan) {this.timeSpan = timeSpan;}}}

2.仿照AddRequestHeaderGatewayFilterFactory

继承AbstractNameValueGatewayFilterFactory

@Component
@Slf4j
public class LogTime2GatewayFilterFactory extends AbstractNameValueGatewayFilterFactory{public LogTime2GatewayFilterFactory() {}public GatewayFilter apply(final AbstractNameValueGatewayFilterFactory.NameValueConfig config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {long start = System.currentTimeMillis();exchange.getAttributes().put("start", start);return chain.filter(exchange).then(Mono.fromRunnable(()->{long end = System.currentTimeMillis();long start1 = exchange.getAttribute("start");HttpRequest request = exchange.getRequest();URI uri = request.getURI();if(Integer.parseInt(config.getValue()) > (end - start1)){log.info("logTime2 uri伟{}不错!{}在50ms之内",uri,end - start1);}log.info("logTime2 uri伟{}不行!太慢啦{}",uri,end - start1);}));}public String toString() {return GatewayToStringStyler.filterToStringCreator(LogTime2GatewayFilterFactory.this).append(config.getName(), config.getValue()).toString();}};}}

证明参数注入成功
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/176304.html

相关文章:

  • 运算符 - Go语言从入门到实战
  • jupyterlab开发环境最佳构建方式
  • Qt_C++读写NFC标签Ntag支持windows国产linux操作系统
  • Web开发-基础知识扫盲
  • SpringMVC 学习(四)RestFul 风格
  • 消息中间件相关知识
  • JackJson多态
  • 孟晚舟最新发声!华为吹响人工智能的号角,发布“全面智能化”战略部署
  • open62541开发:添加sqlite3 历史数据库
  • 美国零售电商平台Target,值得入驻吗?如何入驻?
  • docker freeswitch mysql驱动相关
  • Chrome iframe 跨域失败
  • 【Vue】vue-cli一站式搭建SPA项目
  • CPP代码检查工具
  • 在SpringBoot中利用Redis实现互斥锁
  • vue3+eleement plus日历选择季度
  • 实现动态业务规则的方法(Java)
  • leetcodeTOP100(26)两数相加
  • performance_schema
  • 全新UI基于Thinkphp的最新自助打印系统/云打印小程序源码/附教程
  • Android 13.0 framework层系统手势增加上滑手势home事件功能(相当于Home键)
  • webp格式及其转成
  • echo cat find grep命令
  • Linux学习第20天:Linux按键输入驱动开发: 大道至简 量入为出
  • WordPress主题开发( 七)之—— 模版文件继承规则
  • Simulink 封装
  • 【AI视野·今日Robot 机器人论文速览 第三十六期】Tue, 19 Sep 2023
  • Java随笔
  • ARINC825规范简介
  • SQLAlchemy列参数的使用和query函数的使用