javascript - 如何处理来自 Web 服务的飞行前请求

标签 javascript ajax google-chrome same-origin-policy cors

我有一个基于 GET 的网络服务。要访问此 Web 服务,需要传递一些自定义 header 。

当我尝试使用 GET 方法从 javascript 代码访问 Web 服务时,请求方法正在更改为 OPTIONS。 (域不同)

我阅读了一些文章,发现带有自定义 header 的请求将被预检,在这种情况下,在实际方法调用之前,将向服务器发出带有 OPTIONS 方法的请求。

但我的问题是在 OPTIONS 调用之后,真正的方法(即 GET)没有被调用。

OPTIONS 调用返回 401 状态。

我怀疑这是因为我的网络服务仅支持 GET。我该如何解决这个问题? 请帮忙。 (我的代码在 IE 上运行良好,但在其他浏览器(例如 Chrome)上运行不正常)

最佳答案

需要检查两件事(不知道您的服务器端语言/技术是什么):

  1. 您是否将 OPTIONS 作为有效方法包含在您的 Access-Control-Allow-Methods 中?示例:

    Access-Control-Allow-Methods: GET, OPTIONS
    
  2. 您的请求发送的自定义 header 是否按允许返回给浏览器? 示例:

    Access-Control-Allow-Headers: X-PINGOTHER 
    

在任何安全的、符合标准的浏览器(即不是旧版本的 IE)允许非源响应通过之前,远程服务器必须返回这两个(肯定是第二个)。

因此,如果您想在 HTTP 服务器级别实现它并保持您的网络服务可移植,您可以尝试以下方法:

我们假设您的网络服务 URL 是 http://example.org/service 并且服务路径是 /srv/www/service

如果您运行的是 Apache 2.0,附加 header 的语法是 add,在 2.2 上,使用 set

因此,您将修改 /srv/www/service/.htaccess 为:

 Header set Access-Control-Allow-Methods "GET, OPTIONS"
 Header set Access-Control-Allow-Headers "X-MY_CUSTOM_HEADER1,X-MY_CUSTOM_HEADER2"
 Header set Access-Control-Allow-Origin "*"

当然,mod_headers Apache 模块需要打开才能使上述工作正常进行。此外,将 allow-origin 设置为通配符是有风险的,如果您发送 Access-Control-Allow-Credentials: true header (不能使用在这种情况下是通配符)。此外,使用 Apache 的 SetEnvIf mod,您可以微调 htaccess 文件以仅在适当时返回 header ,而不是针对对该目录的所有请求。

关于javascript - 如何处理来自 Web 服务的飞行前请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314255/

相关文章:

javascript - CSS Div 滚动高度

visual-studio - 使用 MSVS Tester Edition 工具有效测试支持 AJAX 的网页有什么建议吗?

javascript - rails 5 : refresh partial in another partial with AJAX update action

javascript - window.location.hash 在 Chrome 中刷新?

javascript - Angular.js指令模板: break line

javascript - 如何为同一行创建多个where子句?

javascript - 对象处理的 localStorage 数组

javascript - ajax,变量未定义?

Chrome 阻止了 Javascript 打印

javascript - HTML 对话框打开时聚焦按钮元素