Domino、CORS 和 OPTIONS 请求
Posted
技术标签:
【中文标题】Domino、CORS 和 OPTIONS 请求【英文标题】:Domino, CORS and the OPTIONS request 【发布时间】:2015-06-11 06:12:47 【问题描述】:我正在开发一个使用 Domino 作为后端的 AngularJS 应用程序。由于我需要比 Domino 访问服务 (DAS) 提供的更多自定义选项,因此我的下一个选择是扩展库中的 REST 服务。
该应用程序在与 Domino 不同的域上运行,因此我需要添加 CORS 标头以使该方案正常工作。使用 CORS,浏览器(对于某些请求)首先向服务器发出预检 HTTP OPTIONS 请求,以检查允许的方法(更多关于 CORS 的信息:http://www.html5rocks.com/en/tutorials/cors/)。
我现在遇到的问题是 Domino 在该 OPTIONS 请求上抛出了 Method Not Allowed
错误(响应代码 405)。我已经将它添加到我的网站文档中的允许方法列表中(尽管我不确定 REST 服务是否会遵守这一点)。请求可以通过 DAS 顺利完成。
查看扩展库中RestDocumentJsonService
的source code 似乎根本不支持OPTIONS 方法。
对如何进行这项工作有任何想法吗?还是寻求解决方法?我知道我可以编写自己的 servlet 或在 Domino 前面安装代理,但我不想走那条路(还 ;-)
【问题讨论】:
您是否尝试将 POST 请求的内容类型覆盖为“application/x-www-form-urlencoded”、“multipart/form-data”或“text/plain”?这可以防止浏览器发送预检请求。 这不起作用(对于xe:restService
组件):它会抛出一个错误,指出 Content-Type 必须是 application/json
(对于 POST 请求,以及 PUT 和 PATCH) .
如果你真的想在 RestDocumentJsonService 中添加 OPTIONS 方法,你可以扩展它,只覆盖你需要的东西,然后在扩展库的 Rest Service 中将它用作自定义服务
我会稍微探索一下。这确实意味着我不能简单地使用可配置的 REST 服务之一,设置(例如)正确的视图并完成:(
【参考方案1】:
马克,只是一个简短的评论。我不确定这是否适合你。
但我在当前项目中所做的是将 Angular 应用程序放在 NSF 的 WebContent 文件夹中。这有几个目的 - 其中之一是在同一 NSF 中使用正确版本的后端代码轻松部署。我已经为源代码控制设置了数据库,并直接在 NSF 的磁盘项目中编辑了 Angular 部分,并在我需要运行它时同步它们。作为副作用,此设置还将解决任何 CORS 问题,因为客户端代码是从与调用我的 REST 服务的域相同的域启动的;-)
/约翰
【讨论】:
嗨,约翰。谢谢。这当然可行,因为我不再需要处理 CORS。但是......我想尝试使用单独的域和 CORS 来实现这项工作。我认为在这种情况下将 Angular 应用程序托管在单独的服务器上更有意义。 嗨,马克,好吧,我是这么认为的……(正如我所指出的)……这很有意义:-)【参考方案2】:如果您尝试使用经过身份验证的 CORS,则至少需要四个标头才能工作
Access-Control-Allow-Credentials: true
access-control-allow-header: X-Requested-With, Origin, Accept, Accept-Version, Content-Type
access-control-allow-method: OPTIONS, GET, PUT, POST, DELETE, PATCH
access-control-allow-origin: http://yourOtherDomain.com
很遗憾,您只能通过网站文档添加 3 个标题
您无法通过 Phase Listener 添加任何内容,因为 ExtLib Rest Services 不通过 XSP Phases
您可以使用代理,例如 nginx,或者在我的情况下我使用 IHS
http://xomino.com/2014/04/20/adding-custom-http-headers-to-domino-r9-using-ibm-http-server-ihs/
或者您可以滚动您自己的 REST 服务并添加您想要的任何标头
【讨论】:
不需要代理服务。您可以使用PhaseListener
将标题添加到xe:restService
组件。这些服务将触发RESTORE_VIEW
阶段。
@MarkLeusink 您能否解释一下如何以这种方式进行身份验证?我不明白您如何发布到 xpage(等)并通过 ajax 应用您的凭据 - 谢谢(如果我的问题没有意义,请原谅我;我正在寻找使用这些东西的方法)
自 9.0.1 FP6 起,可以选择通过 notes.ini 参数“HTTPAdditionalRespHeader=以上是关于Domino、CORS 和 OPTIONS 请求的主要内容,如果未能解决你的问题,请参考以下文章
CORS:在成功的 OPTIONS 请求后,Firefox 不发送 POST 请求......适用于 Chrome 和 IE
如何在 CORS 预检 OPTIONS 请求中发送自定义标头?