仅对应用程序/json 发生的预检响应

Posted

技术标签:

【中文标题】仅对应用程序/json 发生的预检响应【英文标题】:Response for Preflight occuring only for application/json 【发布时间】:2019-02-09 17:03:10 【问题描述】:

我一直在尝试从 angular 5 向我的 spring mvc 后端发送一个发布请求。但是,我收到预检响应是 inavlid(redirect) 错误消息。自 4 天以来,我一直在寻找解决方案,但没有成功。我已经尝试了所有设置内容类型标题的建议。在这样做的同时,我正在观察一件不寻常的事情。仅当我将内容类型标头设置为 application/json 时才会发生预检错误。如果我将标题设置为 text/plain,则预检错误消失,但显示 415 不支持的媒体类型错误。我一直在挖掘东西以获得一些帮助。非常感谢任何帮助或建议。

【问题讨论】:

【参考方案1】:

使用 chrome,查看开发者工具 - 控制台并查看确切的错误。

您的服务没有为您的 OPTIONS 请求正确设置预检响应。

如何验证我的服务是否已准备好 CORS

    使用 PostMan 或 RestClient 并发出 OPTIONS 请求,而无需其他任何内容(无身份验证,无任何内容) 从步骤 1 中查找 OPTIONS 请求的响应标头。 响应标头可能如下所示

访问控制允许来源:http://exampledomain.comg

Access-Control-Allow-Methods:GET、POST(或您希望允许的任何方法)

访问控制允许标头:内容类型

【讨论】:

如果我将内容类型更改为文本/纯文本预检错误可以避免,但我必须处理 415 不支持的媒体类型。 您是服务所有者吗?如果没有,您将需要与他们联系 您能在选项响应中的允许标题上看到内容类型吗? 我尝试通过 Postman 发出 post 请求,将授权标头设置为 NTLM 并通过对象与请求一起传递,它返回状态为 200 ok。所以,我猜是授权导致了这个问题。现在我只是想知道如何通过角度添加与 NTLM 相同的授权标头并将其传递给后端以成功完成发布请求。 我可以看到内容类型为 application/json 作为响应【参考方案2】:

在您的控制器上添加 crossOrigin Annotation,如果您有多个控制器,则添加到所有控制器上

@CrossOrigin(origins = "*")
@RestController

【讨论】:

以上是关于仅对应用程序/json 发生的预检响应的主要内容,如果未能解决你的问题,请参考以下文章

CORS 问题:预检响应具有无效的 HTTP 状态代码 403

发生预检响应无效(重定向)错误

Rails 在 CORS 预检选项请求中以 404 响应

已启用 CORS,但在 POST JSON 时,预检响应的 HTTP 状态代码 404 无效

将 Spring Security(双向 SSL)配置为仅对 CORS 预检 OPTIONS 请求进行身份验证

禁止预检 403 响应