ajax - 飞行前 OPTIONS 请求通过 HTTPS 失败

标签 ajax apache tomcat cross-domain

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

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

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

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 服务器会响应我的所有请求。/通过浏览器。

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

最佳答案

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

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

不那么简单的类型是使用自定义 header 、利用 POST 或 GET 以外的请求方法以及使用不同内容正文类型的任何请求。这些请求将被“预检”;也就是说,浏览器将代表客户端发出预检请求,以确定服务器是否允许该请求。预检请求使用 OPTIONS 方法。我敢打赌,如果您使用 Firebug 之类的工具来查看正在发生的情况,您将在“网络”选项卡中看到类似的内容:“选项事件”,状态为“已中止”。

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

SSLVerifyClient optional

我之前曾使用过此方法,以便通过 HTTPS 进行跨域 AJAX 调用。

祝你好运。

关于ajax - 飞行前 OPTIONS 请求通过 HTTPS 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18037686/

相关文章:

java - Tomcat 未运行, "eval:/usr/lib/jvm/java-8-openjdk/bin/java: not found"

java - 如何重新使用 JDBC 连接?

php - Telegram BotApi,将消息发送到多个 chat_id

javascript - AJAX 调用 CSV 文件返回?对于某些字符

javascript - 如何阻止Chrome开发者工具的ajax调用?

php - 在以下情况下如何使用 mod_rewrite 获取简短的唯一 URL?

javascript - 从ajax调用结果更新qtip内容

php - 登录 Apache 后如何将凭据传递给 PHP 脚本

apache(端口80)和iis(端口8080)

java - 如何知道客户端是否关闭了连接