首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类Rack::油门

子类Rack::油门
EN

Stack Overflow用户
提问于 2013-03-03 00:39:29
回答 1查看 597关注 0票数 0

我正在阅读有关Rack::Throttle的文章,我希望将默认的客户端标识符从IP更改为其他内容。文件说这是可以做到的

存储和维护Rack::样带节流阀的限速计数器被键控到唯一的HTTP客户端。 默认情况下,HTTP客户端通过Rack::Request#ip返回的IP地址进行唯一标识。如果您希望使用更细粒度的、特定于应用程序的标识符(如会话密钥或用户帐户名称),则只需要子类一个节流策略实现并覆盖#client_identifier方法。

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

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-05 07:19:29

您应该子类一个现有的齿条节流阀类(可能是Rack::Throttle::IntervalRack::Throttle::TimeWindow,无论哪个类更符合您的需要)并重写#client_identifier方法。

#client_identifier被传递给一个参数,request,它是一个机架::请求实例,包含传入的HTTP请求中传递的信息,可以用于获取信息,如headers、cookies、path,以及可能的其他信息(取决于应用程序)。默认实现看起来是像这样

代码语言:javascript
复制
# @param  [Rack::Request] request
# @return [String]
def client_identifier(request)
  request.ip.to_s
end

下面是一个子类Rack::Throttle::Interval以匹配查询参数(如?user_id=<id> )上的请求的示例

代码语言:javascript
复制
class UserThrottle < Rack::Throttle::Interval
  def client_identifier(request)
    request['user_id']
  end
end

您可以在Rack应用程序中使用以下方法进行use

代码语言:javascript
复制
use UserThrottle, :min => 100

注意,您仍然可以将:min这样的选项传递给Rack use语句,因为它只是对现有的节流类进行子类划分。在Rails应用程序中采用这个方法只需要在use文件中调用application.rb (参见扶手架)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15181167

复制
相关文章

相似问题

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