【问题标题】:Cross domain jQuery ajax call with credentials带有凭据的跨域 jQuery ajax 调用
【发布时间】:2012-12-06 21:43:36
【问题描述】:

我已按照以下步骤操作:

  1. 让服务器允许跨域调用(包含所有标头和内容)这可行
  2. 用一些跨域调用测试服务器这可行
  3. 让服务器强制一个证书这可行
  4. 使用浏览器转到服务器上的文件,选择正确的证书并查看该文件仍然有效
    现在我们进入精彩部分 李>
  5. 将跨域调用与证书结合

问题

我正在从浏览器获取证书请求,但是当我选择与使用浏览器时相同的证书时,会发出调用但我收到 403 Forbidden。

代码

$.ajax({
     type: "POST",
     xhrFields: {withCredentials: true},
     dataType: "xml",
     contentType: "text/xml; charset=\"utf-8\"",
     url: "https://www.myOtherServer.com/testfile.asp",
});

有什么想法吗?

编辑

Access-Control-Allow-Credentials: trueAccess-Control-Allow-Origin 已正确配置。

其他信息

我开始认为它与内容类型有关。当我将其更改为 "text/html" 时,我收到 415 错误,但我确实需要发送 xml,因为它是一个 SOAP 服务器。

响应标头

Access-Control-Allow-Cred...    true
Access-Control-Allow-Head...    Content-Type, Origin, Man, Messagetype, Soapaction, X-Test-Header
Access-Control-Allow-Meth...    GET,POST,HEAD,DELETE,PUT,OPTIONS
Access-Control-Allow-Orig...    https://www.mywebsite.com
Access-Control-Max-Age  1800
Cache-Control   private
Content-Length  5561
Content-Type    text/html; charset=utf-8
Date    Wed, 19 Dec 2012 15:06:46 GMT
Server  Microsoft-IIS/7.5
X-Powered-By    ASP.NET

请求标头

Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language nl,en-us;q=0.7,en;q=0.3
Access-Control-Request-He...    content-type
Access-Control-Request-Me...    POST
Cache-Control   no-cache
Connection  keep-alive
Host    myhoast.com
Origin  https://www.mywebsite.com
Pragma  no-cache
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0

【问题讨论】:

    标签: javascript jquery certificate cross-domain


    【解决方案1】:

    基本上我们只需要写在 htaccess 上

    Header set Access-Control-Allow-Origin “*”
    

    但是当我们需要 cookie 等时,我们必须在您的 ajax 代码和 htaccess 上添加脚本

    我在我的博客 blog.imammubin.com/cross-domain-xhr/2014/05/28/ 上写了关于跨域 XHR 的文章(编辑:站点编号不再存在)

    希望对您有所帮助..

    【讨论】:

      【解决方案2】:

      我最好的猜测是,这不是您的 Javascript 的问题,而是您的 CORS 配置的问题。您是否使用 Access-Control-Allow-Credentials: true 标头设置了您的服务器? http://www.w3.org/TR/cors/#access-control-allow-credentials-response-header

      另请注意,即使设置了 allow-credentials 标头,如果 Access-Control-Allow-Origin 为 *,浏览器也不会允许响应凭据请求,根据以下文档:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control#Requests_with_credentials

      编辑:由于 OP 正确设置了 CORS 标头,问题似乎是服务器拒绝带有 403 状态代码的 OPTIONS 请求。 OPTIONS 请求(称为“预检请求”)在某些跨域请求(例如具有 application/xml 内容类型的 POST)之前发送,以允许服务器通知浏览器允许哪些类型的请求。由于浏览器没有看到它期望从 OPTIONS 请求中得到的 200 响应,因此它不会触发实际的 POST 请求。

      【讨论】:

      • 我编辑了我的问题,这些标题是正确的。还有其他想法吗?
      • 嗯。您可以发布您在请求和响应中看到的实际标头吗? (您可以在 Chrome 开发工具中看到这些内容。)您应该会看到一个 OPTIONS 请求,其响应包含 Access-Control-Allow-Origin: http://yourdomain.comAccess-Control-Allow-Methods: POST, OPTIONSAccess-Control-Allow-Credentials: true。当您更改内容类型时,它会变成一个简单的(不是预先发送的)请求,因此服务器可能无法正确响应 OPTIONS 请求?
      • 我在我的问题中添加了请求和响应标头,我目前正在研究 OPTIONS 请求,感谢您为我指明这个方向
      • 我对 OPTIONS 请求的问题感到奇怪的是,我得到了 403 禁止而不是 405 方法不允许(如果您无法执行 OPTIONS 请求,您会期望这种方法)
      • 未来读者请注意:OP 没有指定正在使用哪种服务器后端,但有几个消息来源说 Tomcat 专门有一个默认的 OPTIONS 处理程序,如果你不这样做,它将返回 403手动覆盖它。请注意!
      猜你喜欢
      • 1970-01-01
      • 2014-11-18
      • 2010-10-08
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 2014-12-14
      相关资源
      最近更新 更多