2013-03-03 42 views
0

我正在阅读有关Rack :: Throttle,我想将默认客户端标识符从IP更改为其他某些。该文件说可以完成子类Rack :: Throttle

由Rack :: Throttle存储和维护的限速计数器是 键入唯一的HTTP客户端。

默认情况下,HTTP客户端由Rack :: Request#ip返回的IP地址 唯一标识。如果您希望改为使用更详细的特定于应用程序的标识符(例如会话密钥或 用户帐户名称),则只需实施限制策略的子类 实施并覆盖#client_identifier方法。

我不知道在哪里添加,在这里是我目前的另一种方法的子类。有人知道怎么做这个吗? https://github.com/datagraph/rack-throttle

module Rack 
    module Throttle 
    class DailyRequests < Daily 
     def allowed?(request) 
     ## Insert rules 
     super request 
     end 
    end 

    class HourlyRequests < Hourly 
     def allowed?(request) 
     ## Insert rules 
     super request 
     end 
    end 

    class RequestInterval < Interval 
     def allowed?(request) 
     ## Insert rules 
     super request 
     end 
    end 
    end 
end 
+0

[覆盖client_identifier方法](https://github.com/datagraph/rack-throttle/blob/master/lib/rack/throttle/limiter.rb#L157),我想。 – Zabba 2013-03-03 05:49:29

回答

1

你应该继承现有rack-throttle类(大概无论是Rack::Throttle::IntervalRack::Throttle::TimeWindow,哪一个与您的需求更加贴紧)之一,覆盖#client_identifier方法。

#client_identifier传递一个参数,request,这是在传入的HTTP请求,通过了Rack::Request实例包含的信息,可用于获取信息,如HTTP头,Cookie路径,并根据您的应用程序可能还有其他信息。默认实现查找like this

# @param [Rack::Request] request 
# @return [String] 
def client_identifier(request) 
    request.ip.to_s 
end 

这里的子类Rack::Throttle::Interval的一个例子,以匹配查询参数的要求,如?user_id=<id>

class UserThrottle < Rack::Throttle::Interval 
    def client_identifier(request) 
    request['user_id'] 
    end 
end 

,你可能use与机架应用:

use UserThrottle, :min => 100 

请注意,您仍然可以将诸如:min之类的选项传递到机架use声明,因为它只是对现有节气门类进行子类化。在Rails应用中采用这种方法只需要在application.rb文件中调用use(请参阅Rails on Rack)。

+0

谢谢你这个工作 – 2013-03-08 19:29:26