2

我的客户端服务器(在 Apache @ 端口 443 上运行)向我的 REST 服务器(在 Tomcat @ 端口 8443 上运行)发出的 CORS POST 请求 (AJAX) 在通过 HTTPS 尝试时无法触发。

请注意,所有请求都可以在没有 SSL 的情况下正常运行。

我已经withCredentials: true在请求字段中设置了选项。我的 Tomcat 服务器还负责处理相应的标头:

response.addHeader("Access-Control-Allow-Origin", "https://localhost");
response.addHeader("Access-Control-Allow-Credentials", "true");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
response.addHeader("Access-Control-Allow-Methods", "OPTIONS, POST");

我也尝试使用 Curl,但问题在 SSL 上仍然存在。但是,当直接通过Postman / 通过浏览器尝试时,Tomcat 服务器会响应我的所有请求。

有人可以告诉我我在这里错过了什么吗?

4

1 回答 1

4

我假设这是预检请求的问题。CORS 请求有两种类型:简单和不那么简单。

简单类型是没有自定义标题的 GET 或 POST,其内容类型为“text/plain”。

不那么简单的类型是使用自定义标头、使用 POST 或 GET 以外的请求方法以及使用不同的内容主体类型的任何请求。这些请求将被“预检”;也就是说,浏览器将代表客户端发出预检请求,以确定服务器是否允许此请求。预检请求使用 OPTIONS 方法。我敢打赌,如果您使用 Firebug 之类的东西来查看发生了什么,您会在“网络”选项卡中看到类似这样的内容:“OPTIONS 活动”,状态为“已中止”。

不幸的是,预检请求没有将客户端证书传递给服务器,这就是您的请求未能触发的原因。您需要禁用两种方式的 SSL 才能使其正常工作。在 Apache 中,您可以尝试将 SSLVerifyClient 更改为:

SSLVerifyClient optional

为了让我的跨域 AJAX 调用通过 HTTPS 工作,我以前使用过它。

祝你好运。

于 2013-09-12T07:07:58.970 回答