当前位置: 首页 > 知识库问答 >
问题:

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

桂德义
2023-03-14

即使响应包含ajax请求的“设置cookie”头,cookie也不会存储在浏览器上。

请求html" target="_blank">代码:

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 ); 
            }
        }); 
        }

收到的响应标题:

访问控制允许凭据:true

访问控制允许标头:X-request-With、accept、内容类型、Cookie

访问控制允许方法:POST、GET、PUT、OPTIONS、DELETE

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

访问控制最大年龄:3600

内容编码:gzip

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

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

服务器:Apache-Coyote/1.1

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

传输编码:分块

Vary:接受编码

凭据:真

当相同的url从浏览器命中时,我可以看到存储在浏览器中的cookie,但在ajax请求的情况下,它不会被存储。因此无法发送除此cookie之外的后续请求。

共有2个答案

晏正豪
2023-03-14

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

通过CORS在浏览器上设置Cookie,带有Ajax请求

帮助查找原因,并能够使用XMLHttpRequest存储cookie,凭据设置为true

钱稳
2023-03-14

您正在以HTTP头的形式发送带有凭据的:true,这没有任何用处。您应该将其设置为XHR字段。在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头实际上也都是无用的:

>

跨域也不是HTTP头。它可以用作jQuery AJAX设置(即在标题对象之外),以强制jQuery将请求视为跨域的,即使目标URL看起来与当前页面的域相匹配。对你来说,这也没用。

jQuery会自动添加X-request-With:XMLHttpRequestHTTP头,因此将其指定为自定义头是100%冗余的。

无需显式发送HTTP内容类型头,因为jQuery将自动生成一个。如果您希望指定jQuery应该为请求使用哪种内容类型,那么应该使用标题之外的内容类型设置来指定。在任何情况下,您指定的都是默认值。

类似地,您应该使用jQuery$,而不是发送自定义HTTPAccepts头。ajax()settingsaccepts和/或dataType来控制jQuery在响应中将接受哪些内容类型。通常您不需要这样做,因为jQuery使用的默认值很好,除非您的服务器配置错误并发送错误的内容类型。

 类似资料:
  • 本文向大家介绍浅谈Ajax请求与浏览器缓存,包括了浅谈Ajax请求与浏览器缓存的使用技巧和注意事项,需要的朋友参考一下 在现代Web应用程序中,前端代码充斥着大量的Ajax请求,如果对于Ajax请求可以使用浏览器缓存,那么可以显著地减少网络请求,提高程序响应速度。 1. Ajax Request 使用jQuery框架可以很方便的进行Ajax请求,示例代码如下: 非常简单,注意其中的第4行代码:ca

  • 我试图找出一个跨领域的API问题。我有一个用Sencha Touch 2.3.1创建的应用程序,它使用Ajax从远程服务器获取数据。我面临的问题是,所有针对本地服务器的Ajax请求在响应中并不包含所有的头。在远程服务器上,一切正常,标题也正常。 以下是两个打印件,显示了每个服务器单独发送和接收的标头 1 -从本地主机发送和接收的头(http://local.api - vhost) 收到的邮件头:

  • 问题内容: 我想在javascript /浏览器中启用ajax响应的缓存。 从jquery.ajax docs : 默认情况下,始终发出请求,但浏览器可能会在其缓存之外提供结果。要禁止使用缓存的结果,请将cache设置为false。如果自上次请求以来未修改资产,则导致请求报告失败,请将ifModified设置为true。 但是,这些地址都没有强制缓存。 动机: 我想在我的初始化函数中放入调用,其中

  • 我尝试使用ETAG从api请求缓存json响应。我调用类似http://localhost:3000/api/config的代码,并获取: Thx响应。

  • 我正在浏览一个似乎通过javascript填充数据的网页。我想为我的浏览器使用一个扩展,它可以让我看到对什么url发出了什么请求,以及从请求中返回了什么数据。 任何帮助都将不胜感激。