即使响应包含ajax请求的“Set-Cookie”标头,cookie也不会存储在浏览器中

时间:2018-06-06 15:39:05

标签: jquery ajax google-chrome setcookie jquery-cookie

即使响应包含ajax请求的“Set-Cookie”标头,

cookie也不会存储在浏览器中。

请求代码:

function hitLogin(){
        var loginUrl = "http://myapp:8080/login";

        var geturl;
        $.ajax({

            type: "GET",
            url : loginUrl,
            data:   {
            user : "user1",
            password : "encryptedPassword"              
            },              
            headers: {
                "credentials": 'include',
                "withCredentials" : true,
                "crossDomain": true,
                "X-Requested-With" : "XMLHttpRequest",
                "Content-type" : "application/x-www-form-urlencoded",
                "Accept":"text/plain",
            },              

            success : function(data)
            {                   
                alert("Ajax request data: "+data);
            },
            error: function( xhr, status, error ) 
            {
                alert("Ajax request error: "+status ); 
            }
        }); 
        }

收到回复标题:

  

接入控制允许凭证:真

     

接入控制允许接头:X-请求-随着,接受,内容类型,饼干

     

接入控制允许的方法:POST,GET,PUT,OPTIONS,DELETE

     

访问控制允许来源:http://myapp2.com:7011

     

访问控制 - 最大值 - 年龄:3600

     

内容编码:gzip

     

内容类型:文本/无格式;字符集= ISO-8859-1

     

日期:2018年6月6日星期三15:10:09 GMT

     

服务器:Apache-狼/ 1.1

     

设置Cookie:的myCookie = 62lml5_S7qS31KaFDg-SH-e8Ds5FPjljCIHzfmhxMAr8Fdrqr6fHLjI7s2XPAO2P3tNFLNLS1_fgvDXF4pLmfg#1s1S1#正常假;   路径= /;仅Http

     

传送编码:分块

     

有所不同:接受编码

     

withCredentials:真

我可以在浏览器中看到相同网址时存储在浏览器中的cookie,但是如果是ajax请求,则不会存储。 因此无法发送后续请求,除了此cookie。

2 个答案:

答案 0 :(得分:0)

您正在发送withCredentials: true作为HTTP标头,这没有任何用处。您应该将其设置为XHR field。在jQuery中,你可以这样做:

$.ajax({
    type: "GET",
    url: loginUrl,
    data: { /* request parameters here */ },
    headers: { /* custom HTTP headers here, if you need any */ },
    xhrFields: {
        withCredentials: true,
    },
    /* other AJAX settings here */
})

此外,您发送的所有其他自定义HTTP标头实际上也没用:

  • credentials: include既不是有效的HTTP标头,也不是XHR字段,也不是jQuery AJAX setting。相反,它似乎是jQuery' withCredentials: true的{​​{3}}等价物。无论如何,这里没用。

  • crossDomain也不是HTTP标头。它可以用作jQuery AJAX设置(即外部 headers对象),以强制jQuery将请求视为跨域,即使目标URL也是如此似乎与当前页面的域匹配。在你的情况下,它也没用。

  • jQuery会自动添加X-Requested-With: XMLHttpRequest HTTP标头,因此将其指定为自定义标头是100%冗余。

  • 不需要显式发送HTTP Content-Type标头,因为jQuery会自动生成一个标头。如果您希望指定jQuery应该为请求使用哪种内容类型,则应使用contentType设置外部 headers来执行此操作。在任何情况下,您指定的是默认值。

  • 同样,您应该使用jQuery Accepts设置$.ajax()和/或accepts来控制哪些内容类型,而不是发送自定义HTTP dataType标头jQuery将在响应中接受。通常你不需要,因为jQuery使用的默认值很好,除非你的服务器配置错误并发送了错误的内容类型。

答案 1 :(得分:0)

如上所述,这是CORS的情况,因此jquery请求无法设置cookie。

Set-Cookie on Browser with Ajax Request via CORS

帮助查找原因,并能够使用 withCredentials 设置为 true

将XMLHttpRequest存储起来