我在 Rails 3 应用程序中使用 rack-throttle
作为速率限制引擎。我已经基于 Rack::Throttle::Interval
创建了自己的类来定义自定义速率限制逻辑。我正在检查请求是否针对精确的 Controller 和精确的操作。如果我发出 GET
请求,这很好用。但是,如果我发送 POST
请求,我会遇到一些问题。
class CustomLimiter < Rack::Throttle::Interval
def allowed?(request)
path_info = Rails.application.routes.recognize_path request.url rescue path_info = {}
if path_info[:controller] == "some_controller" and path_info[:action] == "some_action"
super
else
true
end
end
end
这是我的 Controller Action
def question
#user is redirected here
end
def check_answer
#some logic to check answer
redirect_to question_path
end
我的路线
get "questions" => "application#question", :as => "question"
post "check_answer" => "application#check_answer", :as => "check_answer"
编辑:
问题是 POST
请求进入应用程序,因此调用方法 allowed?
。但是当我调用 Rails.application.routes.recognize_path
时,我得到了一个 Route set not finalized
异常。我如何防止用户在 rack-throttle
中间件添加在application.rb
class Application < Rails::Application
#Set up rate limiting
config.require "ip_limiter"
config.require "ip_user_agent_limiter"
config.middleware.use IpLimiter, :min => 0.2
config.middleware.use IpUserAgentLimiter, :min => 2
end
IpLimiter
和IpUserAgentLimiter
都派生自自定义限制器
最佳答案
阅读 Rails.application.routes.recognize_path ( http://apidock.com/rails/ActionDispatch/Routing/RouteSet/recognize_path ) 的代码后,此方法获得第二个参数,您可以在其中传递方法。
尝试:
path_info = Rails.application.routes.recognize_path(request.url, {:method => request.request_method}) rescue path_info = {}
我想毕竟方法可行。
关于ruby-on-rails - 在 Rails 应用程序中限制 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9662795/