我正在阅读有关Rack::Throttle的文章,我希望将默认的客户端标识符从IP更改为其他内容。文件说这是可以做到的
存储和维护Rack::样带节流阀的限速计数器被键控到唯一的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发布于 2013-03-05 07:19:29
您应该子类一个现有的齿条节流阀类(可能是Rack::Throttle::Interval或Rack::Throttle::TimeWindow,无论哪个类更符合您的需要)并重写#client_identifier方法。
#client_identifier被传递给一个参数,request,它是一个机架::请求实例,包含传入的HTTP请求中传递的信息,可以用于获取信息,如headers、cookies、path,以及可能的其他信息(取决于应用程序)。默认实现看起来是像这样
# @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您可以在Rack应用程序中使用以下方法进行use:
use UserThrottle, :min => 100注意,您仍然可以将:min这样的选项传递给Rack use语句,因为它只是对现有的节流类进行子类划分。在Rails应用程序中采用这个方法只需要在use文件中调用application.rb (参见扶手架)。
https://stackoverflow.com/questions/15181167
复制相似问题