这是我的代码,用于限制分钟的请求数:
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)
希望对您有帮助,蒂埃里