首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用APISpark Restlet扩展限制restlet资源的请求

使用APISpark Restlet扩展限制restlet资源的请求
EN

Stack Overflow用户
提问于 2015-03-06 13:31:27
回答 2查看 369关注 0票数 0

下面是限制请求分钟数的代码:

代码语言:javascript
复制
        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多个请求,也不会抛出“太多请求”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-06 14:02:10

我使用GAE项目中的配置代码和dev服务器使其工作。

我使用了GAE的Restlet /Version1.9.18版本2.3.1和以下代码作为客户端:

代码语言:javascript
复制
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次电话会议之后,我有以下例外:

代码语言:javascript
复制
>> 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)

希望它能帮到你,蒂埃里

票数 1
EN

Stack Overflow用户

发布于 2015-06-05 22:07:09

您还可以依赖框架的ApisparkService (我已经使用版本2.3.2对它进行了测试):

代码语言:javascript
复制
public TestApplication() {
    super();
    ApiSparkService as = new ApiSparkService();
    as.setFirewallEnabled(true);
    as.getFirewallConfig().addIpAddressesPeriodicCounter(60, TimeUnit.SECONDS, 10);
    getServices().add(as);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28899855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档