飞行前OPTIONS请求通过HTTPS失败

时间:2013-08-03 21:55:38

标签: ajax apache tomcat cross-domain

我的客户端服务器(在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服务器会响应我的所有请求。

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

1 个答案:

答案 0 :(得分:2)

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

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

不那么简单的类型是使用自定义标头的任何请求,利用POST或GET以外的请求方法,并使用不同的内容体类型。这些要求将“预检”;也就是说,浏览器将代表客户端发出预检请求,以确定服务器是否允许此请求。预检请求使用OPTIONS方法。我愿意打赌,如果你使用像Firebug这样的东西看看会发生什么,你会在Net标签中看到类似的东西:“OPTIONS活动”状态为“Aborted”。

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

SSLVerifyClient optional

我之前使用过这个,以便让我的跨域AJAX调用通过HTTPS工作。

祝你好运。