成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Cloud Gateway通過(guò)全局過(guò)濾器實(shí)現(xiàn)接口防刷

開(kāi)發(fā) 前端
通過(guò)某種機(jī)制實(shí)現(xiàn)對(duì)系統(tǒng)中的某些接口在規(guī)定的時(shí)間段內(nèi)只能讓某個(gè)具體的客戶端訪問(wèn)指定次數(shù),超出次數(shù),就不讓訪問(wèn)了。

環(huán)境:Spring Boot2.7.12 + Spring Cloud2021.0.7

1 概念

通過(guò)某種機(jī)制實(shí)現(xiàn)對(duì)系統(tǒng)中的某些接口在規(guī)定的時(shí)間段內(nèi)只能讓某個(gè)具體的客戶端訪問(wèn)指定次數(shù),超出次數(shù),就不讓訪問(wèn)了。等待指定的時(shí)間到期后又能繼續(xù)訪問(wèn)接口;這里需要注意的是是控制到每一個(gè)具體的接口上,所以必須確定兩個(gè)要素:

  1. 客戶端是誰(shuí)
  2. 訪問(wèn)的接口

2 實(shí)現(xiàn)原理

可以通過(guò)2種方式實(shí)現(xiàn):

  1. 通過(guò)網(wǎng)關(guān)
    可以控制到所有的服務(wù)
  2. 通過(guò)AOP
    該方案只能針對(duì)具體的每一個(gè)服務(wù),代碼重復(fù),如果通過(guò)

本篇文章我們通過(guò)網(wǎng)關(guān)實(shí)現(xiàn),那接下來(lái)就是考慮上該如何去記錄當(dāng)前客戶端訪問(wèn)的具體接口在指定的時(shí)間內(nèi)已經(jīng)訪問(wèn)了多少次了?通過(guò)兩種方式:

  1. JVM層
    該種實(shí)現(xiàn)方式,你需要自己實(shí)現(xiàn)時(shí)效性的檢查,實(shí)現(xiàn)麻煩
  2. 通過(guò)Redis
    Redis本身就可以對(duì)Key設(shè)置時(shí)效性,所以非常的方便。本文通過(guò)Redis實(shí)現(xiàn)。

通過(guò) Redis 記錄訪問(wèn)請(qǐng)求的次數(shù),每次訪問(wèn)都進(jìn)行遞減,如果次數(shù)小于0就返回錯(cuò)誤信息,當(dāng)?shù)搅酥付ǖ臅r(shí)效則Redis會(huì)對(duì)過(guò)期的key進(jìn)行自動(dòng)刪除。

3 代碼實(shí)現(xiàn)

Redis配置

spring:
  redis:
    host: localhost
    port: 6379
    password: 123123
    database: 8
    lettuce:
      pool:
        maxActive: 8
        maxIdle: 100
        minIdle: 10
        maxWait: -1

定義全局過(guò)濾器

@Component
public class BrushProofFilter implements GlobalFilter, Ordered {


  private final ReactiveStringRedisTemplate reactiveStringRedisTemplate ;
  
  public BrushProofFilter(ReactiveStringRedisTemplate reactiveStringRedisTemplate) {
    this.reactiveStringRedisTemplate = reactiveStringRedisTemplate ;
  }
  
  @Override
  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    // 獲取客戶端的請(qǐng)求ip
    InetAddress address = exchange.getRequest().getRemoteAddress().getAddress();
    // 獲取請(qǐng)求的URI
    String path = exchange.getRequest().getPath().toString() ;
    // 將其組合為Redis中的Key
    String key = ("ratelimiter:" + address + ":" + path) ;
    // 通過(guò)拋出異常的方式終止序列,然后通過(guò)自定義的WebExceptionHandler處理異常信息 
    return this.reactiveStringRedisTemplate.opsForValue()
        // 這里固定設(shè)置每30s,訪問(wèn)10次
        .setIfAbsent(key, "10", Duration.ofSeconds(30))
        .flatMap(exist -> {
          return this.reactiveStringRedisTemplate.opsForValue().decrement(key) ;
        })
        .doOnNext(num -> {
          if (num < 0) {
            throw new BrushProofException("你訪問(wèn)太快了") ;
          }
        })
        .then(chain.filter(exchange)) ;
  }


  @Override
  public int getOrder() {
    return -2 ;
  }


}

自定義異常

public class BrushProofException extends RuntimeException {


  private static final long serialVersionUID = 1L;
  
  public BrushProofException(String message) {
    super(message) ;
  }
  
}

自定義異常處理句柄

@Component
public class RatelimiterWebExceptionHandler implements WebExceptionHandler {


  @Override
  public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
    if (ex instanceof RatelimiterException re) {
      ServerHttpResponse response = exchange.getResponse() ;
      response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR) ;
      response.getHeaders().add("Content-Type", "text/html;charset=utf8") ;
      // 直接輸出了,異常不進(jìn)行傳遞
      return response.writeWith(Mono.just(response.bufferFactory().wrap(("你訪問(wèn)太快了").getBytes()))) ;
    }
    // 如果是其它異常,則將異常繼續(xù)向下傳遞
    return Mono.error(ex) ;
  }


}

訪問(wèn)測(cè)試

圖片圖片

因?yàn)槲疫@里沒(méi)有這個(gè)接口,所以返回的是降級(jí)接口,也算是正常

當(dāng)超過(guò)10次后:

Redis

圖片圖片

以客戶端請(qǐng)求ip + path作為key

圖片圖片


責(zé)任編輯:武曉燕 來(lái)源: 實(shí)戰(zhàn)案例錦集
相關(guān)推薦

2023-01-26 01:41:27

核心全局過(guò)濾器

2023-04-14 09:01:25

2021-01-14 08:13:39

Spring Clou應(yīng)用內(nèi)置過(guò)濾器

2024-04-03 08:08:15

謂詞網(wǎng)關(guān)開(kāi)發(fā)

2017-04-12 14:43:01

Spring ClouZuul過(guò)濾器

2023-02-15 08:12:19

http超時(shí)過(guò)濾器

2017-05-04 22:30:17

Zuul過(guò)濾器微服務(wù)

2024-01-05 09:04:35

隆過(guò)濾器數(shù)據(jù)結(jié)構(gòu)哈希函數(shù)

2024-11-04 08:45:48

布隆過(guò)濾器元數(shù)據(jù)指紋值

2017-09-15 23:29:53

Spring Clou微服務(wù)架構(gòu)過(guò)濾器

2021-07-05 15:22:03

Servlet過(guò)濾器客戶端

2024-10-09 15:54:38

布隆過(guò)濾器函數(shù)

2009-07-08 15:30:56

Servlet過(guò)濾器

2009-07-14 09:09:08

Swing模型過(guò)濾器

2009-07-08 16:07:04

Servlet過(guò)濾器配

2009-09-29 13:55:23

Hibernate設(shè)置

2011-06-29 16:14:59

Qt 事件 過(guò)濾器

2022-02-16 23:58:41

Spring過(guò)濾器驗(yàn)證碼

2023-02-20 10:13:00

灰度發(fā)布實(shí)現(xiàn)

2022-02-21 23:58:49

Spring過(guò)濾器順序值
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品不卡 | 91免费电影 | 男女污网站 | 波多野结衣av中文字幕 | 亚洲欧美国产一区二区三区 | 国产精品久久久久久久久久久新郎 | se婷婷| 在线观看国产 | 午夜私人影院 | 久久国产精品-久久精品 | 免费在线观看黄色av | 免费看淫片 | 国产毛片久久久久久久久春天 | 美女久久视频 | 亚洲欧美日韩电影 | 狠狠狠色丁香婷婷综合久久五月 | 久久国产视频一区 | 国产在线激情视频 | 成人在线精品视频 | 久久成人免费 | 色狠狠一区 | 久久久国产一区 | 国产在线a| 久久综合婷婷 | www.青娱乐| 蜜桃在线视频 | 欧美色a v | 亚洲欧美一区二区三区国产精品 | 日韩一区二区免费视频 | 国产黄色在线 | 人人人人爽 | 日韩在线视频免费观看 | 国产中文字幕在线观看 | 欧美激情精品久久久久久 | 精品视频一区二区三区在线观看 | 日韩精品一区二区三区视频播放 | 日韩欧美在线不卡 | 日本黄色影片在线观看 | 在线国产精品一区 | 亚洲网一区 | 午夜精品一区二区三区在线视 |