【问题标题】:DoubleRenderError in Rails 4.1 when rescuing from InvalidCrossOriginRequest从 InvalidCrossOriginRequest 救援时 Rails 4.1 中的 DoubleRenderError
【发布时间】:2014-04-28 21:54:46
【问题描述】:

我今天升级到 Rails 4.1.0。跨站点请求伪造 (CSRF) 保护现在也涵盖带有 JavaScript 响应的 GET 请求。

我的应用中有一些远​​程 GET 链接被机器人攻击,现在抛出 ActionController::InvalidCrossOriginRequest 异常。

所以我在 application_controller 中添加了另一个 rescue_from 行:

rescue_from ActionController::InvalidCrossOriginRequest, with: :render_400

这是 render_400 方法:

def render_400
    render(nothing: true, status: 400) and return
end

我仍然收到 AbstractController::DoubleRenderError,即使我添加了 and return,如您在上面看到的。

它只发生在 ActionController::InvalidCrossOriginRequest 异常中。其他人喜欢例如ActionController::BadRequest 并且不会导致 AbstractController::DoubleRenderError。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    根本原因是response_body的某些部分是在触发错误之前分配的。

    您可以在异常处理程序中调用render 之前尝试清除响应正文。

    def render_400
      # Clear the previous response body to avoid a DoubleRenderError
      # when redirecting or rendering another view
      self.response_body = nil
    
      render(nothing: true, status: 400)
    end
    

    【讨论】:

    • 我遇到了 Rails 5.1 的问题,这个解决方案不起作用:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2023-01-13
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多