0

所以我有一个表单,它使 XHR 到外部 api 以获取令牌,然后提交到 url,该 url 在我们后端的“/update”处调用我们的数据库。我们正在尝试通过使用机架攻击节流阀来限制一个人可以使用该表单提出的请求数量。因此,例如在两次尝试后达到限制时,第三次应该给出 429 错误,然后重定向到我们的页面/429。到目前为止我有这个:

throttle '/update', {
    limit: 2,
    period: 60
  } do |req|
    next nil unless req.path == '/update' && req.put?

    req.ip
  end

然后对于我们的油门响应,我们正在做:

Rack::Attack.throttled_response = lambda do |env|
headers = {
        'Location' => '/429'
      }
      [302, headers]
  end

该代码确实有效并返回 429,但即使我们Location在标头中也不会发生重定向。此外,我们有一个端点,我们在其中执行一个GET相同的响应将用户重定向到/429成功。

那么如何在使用 Rack Attack ruby​​ on rails 库发出put或请求时重定向用户?post还有另一种重定向用户的方法吗?任何帮助,将不胜感激。

4

1 回答 1

2

问题在于 HTTP 响应状态代码。如果您希望浏览器重定向,您需要使用 3XX 状态之一。

# frozen_string_literal: true

module Rack
  class Attack
    throttle('test', limit: 1, period: 60.seconds) do |req|
      true
    end
  end

  # response
  Rack::Attack.throttled_response = lambda do |env|
    headers = {
        'Location' => '/test_redirect'
    }
    [301, headers, []]
  end
end
于 2020-04-05T09:42:52.550 回答