引发异常时如何保留响应标头?

Posted

技术标签:

【中文标题】引发异常时如何保留响应标头?【英文标题】:How to preserve response headers when raising an exception? 【发布时间】:2014-03-02 07:09:55 【问题描述】:

我正在使用rack-cors 在我们的 API 请求中添加 CORS 响应标头。

请求成功时(200)它工作正常。但是,当应用程序通过 authenticate_user! (401) 引发异常 ActiveRecord::RecordNotFound (404) 或 devise/invalid credentials 时 - 它不会使用 CORS 响应标头进行响应。

它不仅适用于机架。它不会响应在引发异常之前添加的任何自定义标头。

最大的问题在于客户端(浏览器),因为它没有根据状态码显示正确的错误,而是显示:

XMLHttpRequest 无法加载 http://development.com:4000/orders/1。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://development.com:3000' 因此不允许访问。

如果我手动捕获异常 rescue_fromrender json: , status: 500,它会以标题响应。

【问题讨论】:

你需要启用CORS看这个问题***.com/questions/17858178/… @BrianWheeler 它由 rack-cors 启用。 【参考方案1】:

我一直在与这个问题作斗争,答案是:

设置 Rack::Cors 中间件的顺序很重要。像这样使用它:

config.middleware.insert_after Rails::Rack::Logger, Rack::Cors, :logger => Rails.logger do
  allow do
    origins '*'
    resource '*', headers: :any, methods: %i[get post patch put delete options]
  end
end

更多信息:https://github.com/cyu/rack-cors/issues/33

【讨论】:

先生,你成就了我的一天!

以上是关于引发异常时如何保留响应标头?的主要内容,如果未能解决你的问题,请参考以下文章