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

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

【讨论】:

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

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

在 C# 中引发保留异常时会出现啥问题? [关闭]

使用不同的类型和消息重新引发异常,保留现有信息

如何包装检查的异常但在 Java 中保留原始运行时异常

Angular资源如何保留ajax标头并同时启用cors

保留内存是不是会导致内存不足异常

在 iOS WKWebView 中保留“Referer”标头?