仅对应用程序/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
已启用 CORS,但在 POST JSON 时,预检响应的 HTTP 状态代码 404 无效