小编典典

飞行前选项请求通过HTTPS进行故障转移

tomcat

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

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


阅读 252

收藏
2020-06-16

共1个答案

小编典典

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

简单的类型是没有内容类型为“文本/纯文本”的自定义标头的GET或POST。

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

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

SSLVerifyClient optional

为了使我的跨域AJAX调用能够通过HTTPS进行操作,我之前使用了此方法。

祝好运。

2020-06-16