簡體   English   中英

使用API​​Spark restlet擴展限制對Restlet資源的請求

[英]Limit request on a Restlet resource with APISpark restlet extension

這是我的代碼,用於限制分鍾的請求數:

        MethodAuthorizer ma = createMethodAuthorizer();
        ma.setNext(router);

        FirewallRule rule = new PeriodicFirewallCounterRule(60, TimeUnit.SECONDS, new IpAddressCountingPolicy());
        ((PeriodicFirewallCounterRule)rule).addHandler(new RateLimitationHandler(new UniqueLimitPolicy(10)));
        FirewallFilter firewallFiler = new FirewallFilter(getContext(), list(rule));
        firewallFiler.setNext(ma);

        return ma;

問題是沒有錯誤,但是即使從資源請求了10個以上的請求,它也不會拋出“ Too Many Request”

我使用GAE項目中的配置代碼以及開發服務器使它正常工作。

我使用Restlet的2.3.1版本/ GAE的1.9.18版本以及以下代碼作為客戶端:

public static void main(String[] args) {
    int i = 0;
    try {
        while (i < 30) {
            ClientResource cr = new ClientResource("http://localhost:8080/test");
            Representation repr = cr.get();
            System.out.println(">> call #"+i);
            Thread.sleep(100);

            i++;
        }
    } catch (Exception ex) {
        System.out.println(">> call #" + i + " failed");
        ex.printStackTrace();
    }
}

在第10次通話后,我遇到以下異常:

>> call #0
>> call #1
>> call #2
>> call #3
>> call #4
>> call #5
>> call #6
>> call #7
>> call #8
>> call #9
>> call #10 failed
429 (429) - The server is refusing to service the request because the user has sent too many requests in a given amount of time ("rate limiting")
    at org.restlet.resource.ClientResource.doError(ClientResource.java:590)
    at org.restlet.resource.ClientResource.handleInbound(ClientResource.java:1153)
    at org.restlet.resource.ClientResource.handle(ClientResource.java:1048)
    at org.restlet.resource.ClientResource.handle(ClientResource.java:1023)
    at org.restlet.resource.ClientResource.handle(ClientResource.java:928)
    at org.restlet.resource.ClientResource.get(ClientResource.java:636)
    at org.restlet.gae.test.GaeRestletClient.main(GaeRestletClient.java:15)

希望對您有幫助,蒂埃里

您還可以依賴框架的ApisparkService(我已經使用v2.3.2版對其進行了測試):

public TestApplication() {
    super();
    ApiSparkService as = new ApiSparkService();
    as.setFirewallEnabled(true);
    as.getFirewallConfig().addIpAddressesPeriodicCounter(60, TimeUnit.SECONDS, 10);
    getServices().add(as);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM