2015-03-06 3 views
0

Вот мой код, чтобы ограничить количество запросов за минуту:запрос Ограничение на Restlet ресурс с расширением APISpark Restlet

 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 запроса запрашивается из ресурса все равно он не бросает «слишком много запросов»

+0

Можете ли вы дать мне версию Restlet, которую вы используете? Благодаря! –

ответ

1

Я заставляю его работать с использованием кода конфигурации в рамках проекта GAE и с сервером dev.

Я использовал версию 2.3.1 Restlet/версия 1.9.18 из GAE и следующий код в качестве клиента:

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) 

Надеется, что это помогает вам, Тьерри

1

вы также можете рассчитывать на ApisparkService (я проверил его с помощью выпуска v2.3.2) рамок:

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

Спасибо @thierry за подсказку! – xybrek

Смежные вопросы