背景

一般情况跨域时是无法跨域携带cookie的,也无法跨域写cookie

目标

CORS跨域时携带cookie,跨域写cookie。

参考: https://blog.csdn.net/z69183787/article/details/78954325

操作

Ajax请求,通过设置 withCredentials: true ,发送Ajax时,Request header中便会带上 Cookie 信息。


服务器端
相应的,对于客户端的参数,服务器端也需要进行设置:
response.setHeader("Access-Control-Allow-Credentials", "true");


对应客户端的 xhrFields.withCredentials: true 参数,服务器端通过在响应 header 中设置 Access-Control-Allow-Credentials = true 来运行客户端携带证书式访问。通过对 Credentials 参数的设置,就可以保持跨域 Ajax 时的 Cookie。

这里需要注意的是:

服务器端 Access-Control-Allow-Credentials = true 时,参数 Access-Control-Allow-Origin 的值不能为 '*'

跨域写cookie

通过以上配置,就可实现 跨域写cookie了。

A →  B  , A向B发 跨域的 ajax请求, 通过以上配置就可以携带cookie了。

B →  A , B向A响应数据时,可写cookie。 我测试了同时写了两个域,向A域下写了cookie,向B域下写相同的cookie。


扩展知识

file:/// 与 http://
chrome(webkit核心浏览器)默认只支持online-cookie。
使用http://协议访问一个发布到服务器的网页时,是可设置的cookie的。
使用file:///协议打开一个本地文件(双击运行或者拖进chrome浏览器),设置的cookie是无法保存的。

从上图可以找到chrome默认的启动配置没有保存本地设置的cookie。

要想chrome本地设置的cookie也要能保存,需要配置过chrome,给chrome快捷方式添加 --enable-file-cookies 启动参数,右键点击chrome桌面快捷图标,属性,在目标最后添加 --enable-file-cookies启动参数,注意–前面要有空格。

这样chrome本地测试的时候就可以保存cookie了。


我们使用nui-app 得混合开发技术,开发的app, 页面被打包到 app中,使用 app内置的webView来展示,使用的就是file:///协议。

默认也无法读写cookie  。

uni-app存储
uni-app的存储方案比5+app要少,因为cookie、localstorage、sessionstorage、websql、indexedDB只有h5端支持,其他端都不支持。
uni.storage的键值对存储,这个是全端支持的。
uni-app的Storage在不同端的实现不同,uni.storage在app侧,映射为plus.storage;h5侧映射为localstorage;各个小程序平台映射为其自带的storage键值对存储。