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=”向所有网站规则添加另一个第四个标头,请参阅 www-01.ibm.com/support/docview.wss?uid=swg21984240 感谢您的更新 - 非常感谢您抽出宝贵时间告诉我。

以上是关于Domino、CORS 和 OPTIONS 请求的主要内容,如果未能解决你的问题,请参考以下文章

markdown 带有CORS和OPTIONS请求的流明

CORS:在成功的 OPTIONS 请求后,Firefox 不发送 POST 请求......适用于 Chrome 和 IE

如何在 CORS 预检 OPTIONS 请求中发送自定义标头?

在Chrome中取消了飞行前OPTIONS请求(已支持CORS)

cors / ajax 请求的重复 OPTIONS 请求

请求api网关cors错误