使用 fetch() 或 $.ajax() 发送 cookie

Posted

技术标签:

【中文标题】使用 fetch() 或 $.ajax() 发送 cookie【英文标题】:Sending a cookie using fetch() or $.ajax() 【发布时间】:2018-03-17 17:30:07 【问题描述】:

我相信我使用这个 Golang 代码 sn-p 成功设置了一个 cookie:

c = &http.Cookie
        HttpOnly: false,
        Name:     "_cas_cookie",
        Value:    newSessionID(),
        MaxAge:   86400,
    

    http.SetCookie(w, c)

事实上,我可以使用浏览器检查工具看到它。每次“正常”浏览器单击时,它也包含在请求标头中。但是,它没有包含在我发送的任何 ajax 查询中。我使用 fetch() 和 jQuery 的 $.ajax() 得到了相同的结果。按照设计,如果后端代码没有收到旧的 cookie,它将生成一个具有相同名称的新 cookie。这就是发生的事情,然后新的 cookie 将用于所有未来的 ajax 查询。就好像 http cookie 和 javascript cookie 存在于不同的域中一样。我认为将 HttpOnly 设置为 false 可以解决此问题,但事实并非如此。

这里是 fetch() 代码。

function doGetFetch(url, callback)
    fetch(
        url, 
        method: 'get', 
        credentials: 'same-origin'
        )  
    .then(  
        function(response)   
            if (response.status !== 200) 
                console.log('Problem Status Code: ' +  
                response.status);  
                return false;  
            
            // Examine the text in the response  
            response.json().then(callback);  
        )  
    .catch(function(err)   
        console.log('Fetch Error :-S', err);  
    );

更复杂的是,使用我的 localhost 测试服务器一切正常,但当我部署到生产服务器时失败。两者最大的区别在于 localhost 使用 Golang 的内部 Web 服务器(例如 http.ListenAndServer()),而生产使用 CGI。

感谢您对尝试新事物的任何指示!

【问题讨论】:

这可能是跨域请求问题。也许生产 CGI 服务器上的 Javascript 认为它位于不同的域中,在 localhost 上它没有这样的问题。不过,我还不确定。 【参考方案1】:

比我更好的程序员将问题缩小到 cookie 路径。上面的 Go 代码没有指定路径,因此它将被设置为默认 Go 所做的任何事情。例如,路径从“/seminars.cgi”变为“/seminars.cgi/seminar”,在所有情况下,Javascript 都看不到 cookie。解决方案是明确指定根路径:

c = &http.Cookie
    HttpOnly: false,
    Name:     "_cas_cookie",
    Value:    newSessionID(),
    MaxAge:   86400,
    Path:     "/", //Specify the path at the root


http.SetCookie(w, c)

这行得通。

【讨论】:

以上是关于使用 fetch() 或 $.ajax() 发送 cookie的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fetch

Ajax--使用fetch函数发送AJAX请求

Fetch

fetch 发送 AJAX请求

fetch api和ajax本质的区别

分别使用 XHRjQuery 和 Fetch 实现 AJAX