发送带有跨域帖子的凭据?


80

根据带有凭据的请求,Firefox仅在以下情况下发送凭据以及跨域帖子:

invocation.withCredentials = "true";

设置了…但是看来jQuery的Ajax API似乎没有为此提供任何机制。

有什么我想念的吗?我还有其他方法可以做到吗?

Answers:


167

功能应该在jQuery 1.5中被破坏。

从jQuery 1.5.1开始,您应该使用xhrFields参数。

$.ajaxSetup({
    type: "POST",
    data: {},
    dataType: 'json',
    xhrFields: {
       withCredentials: true
    },
    crossDomain: true
});

文件:http//api.jquery.com/jQuery.ajax/

报告的错误:http : //bugs.jquery.com/ticket/8146


2
现在,我可以将Cookie发送到子域了:)谢谢!
Radek

7
这也应该适用于跨(非子域)ajax请求吗?
streetlight

我仍在提示输入凭据
John Grabanski

@JohnGrabanski您解决了您的问题吗?
Selman

40

您可以使用beforeSend回调来设置其他参数(XMLHTTPRequest对象作为唯一参数传递给它)。

请注意,这种类型的跨域请求在正常的站点方案中将不起作用,并且不能与任何其他浏览器一起使用。我什至不知道FF 3.5还施加了什么安全限制,只是为了确保您不会一无所获:

$.ajax({
    url: 'http://bar.other',
    data: { whatever:'cool' },
    type: 'GET',
    beforeSend: function(xhr){
       xhr.withCredentials = true;
    }
});

要注意的另一件事是,jQuery设置为标准化浏览器差异。您可能会发现jQuery库施加了进一步的限制,禁止了这种类型的功能。


2
根据api.jquery.com/jQuery.post,它应该输入:“ GET”而不是方法:'GET'在使用您的示例时,我绊了一下
Xosofox 2012年

1
@Xosofox我知道这是一个旧注释,但是从jQuery 1.9开始method: 'GET'受支持。 api.jquery.com/jquery.ajax
Brad

1
请注意,这不再适用于jQuery 3+,因为(a)此函数的api已更改,并且(b)它不再具有对XHR对象的访问权限,该对象在此函数运行后创建。相反,您应该使用xhrFields。
cuniculus

2

在jQuery 3甚至更早的版本中,以下更简单的配置也可用于单个请求:

$.ajax(
        'https://foo.bar.com,
        {
            dataType: 'json',
            xhrFields: {
                withCredentials: true
            },
            success: successFunc
        }
    );

我在Firefox开发工具->网络选项卡(对于单个请求的安全选项卡中)遇到的完整错误是:

与foo.bar.com的连接期间发生错误.SSL对等方无法协商一组可接受的安全参数。错误代码:SSL_ERROR_HANDSHAKE_FAILURE_ALERT

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.