方法
实例公有方法
rate_limit(to:, within:, by: -> { request.remote_ip } 链接
对所有操作或由正常before_action
过滤器使用only:
和except:
指定的那些操作应用速率限制。
允许的最大请求数由to:
指定,并限制为within:
给定的时间窗口。
速率限制默认情况下对发出请求的 IP 地址是唯一的,但您可以通过在by:
参数中传递一个可调用对象来提供您自己的身份函数。它在处理请求的控制器的上下文中进行评估。
超过速率限制的请求将被拒绝,并返回429 Too Many Requests
响应。您可以通过在with:
参数中传递一个可调用对象来专门化它。它在处理请求的控制器的上下文中进行评估。
速率限制依赖于一个支持的ActiveSupport::Cache
存储,默认值为config.action_controller.cache_store
,它本身默认为全局config.cache_store
。如果您不想将速率限制存储在与您的通用缓存相同的存储库中,您可以在store
参数中传递一个自定义存储。
如果您希望每个控制器使用多个速率限制,则需要通过name:
选项为它们中的每一个提供一个显式名称。
示例
class SessionsController < ApplicationController
rate_limit to: 10, within: 3.minutes, only: :create
end
class SignupsController < ApplicationController
rate_limit to: 1000, within: 10.seconds,
by: -> { request.domain }, with: -> { redirect_to busy_controller_url, alert: "Too many signups on domain!" }, only: :new
end
class APIController < ApplicationController
RATE_LIMIT_STORE = ActiveSupport::Cache::RedisCacheStore.new(url: ENV["REDIS_URL"])
rate_limit to: 10, within: 3.minutes, store: RATE_LIMIT_STORE
end
class SessionsController < ApplicationController
rate_limit to: 3, within: 2.seconds, name: "short-term"
rate_limit to: 10, within: 5.minutes, name: "long-term"
end
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/rate_limiting.rb, line 55 def rate_limit(to:, within:, by: -> { request.remote_ip }, with: -> { head :too_many_requests }, store: cache_store, name: nil, **options) before_action -> { rate_limiting(to: to, within: within, by: by, with: with, store: store, name: name) }, **options end