服务端与浏览器cookie
大家都知道cookie的作用很大,因为http是无状态协议,很多情况我们都是通过设置cookie,来实现业务上的需求,如登录。只是说不同的技术方案和不同的业务需求,我们的对cookie的操作有所差别,但都是基于cookie。
ps:
浏览器有同源策略,像localStorage
都是遵循这一策略,但是cookie就有所不同,在同域不同端口下,cookie是可以共享的。举个栗子,我在localhost:8080
,设置了一个cookie
,为age=18
,然后我在localhost:8089
是可以从cookie
中拿到这个age
值的。
下面描述的是两个问题:
1、服务端向客户端设置cookie失效
2、客户端向服务端请求数据,cookie消失
场景介绍:用express作为服务端(端口3030),前端(端口3031)用axios进行一个接口请求。因为开发过程存在跨域,所以我在响应头进行如下处理:
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", '*');
res.header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type,token");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
并且接口里面有进行cookie的设置res.cookie(key,vlaue,option)
问题一:浏览器请求接口发现,响应头确实有Set-Cookie,但是并没有真正设置到浏览器的cookie当中。
原因:存在跨域导致服务端无法正常那样把cookie写入浏览器当中,所以我们的响应头得进行修改:
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", req.headers.origin); //由原来的 * 改为当前请求的源
res.header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type,token");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("Content-Type", "application/json;charset=utf-8");
res.header("Access-Control-Allow-Credentials",true); // 允许cookie的发送
next();
});
注意就可以服务端就可以顺利的在跨域中把cookie写入浏览器。
问题二:我用axios请求时,发现浏览器的cookie,并没有顺利的发送给服务端?
原因:axios默认在跨域情况下是不会发送cookie,需要在配置中进行设置,
把withCredentials
设置为true
即可.
总结:服务端的头部的设置和前端请求方式withCredentials
凭证的开启是要同时满足的。这有这样才能正常的进行服务端对客户端cookie的设置,和客户端发送cookie到服务端,服务端顺利的接收。