node中cookie与session的应用

                                                         node中cookie与session的应用

   既然要了解cookie与session的设置,那么首先就应该知道的什么是cookie与session,以及其作用与如何去使用。那么首先就来了解cookie

什么是cookie?
1.存储在浏览器中的一段字符串(最大为5kb)
2.跨域不共享
3.cookie的格式为k1 = v1; k2 = v2; k3 = v3;
4.每次发送http请求时,会将请求域的cookie一起发送给server
5.server可以修改cookie并返回给浏览器
6.在浏览器中也可以通过js来修改cookie

在发送cookie的过程中,需要将对应的cookie发送到其对应的服务器端,如果在发送错误其他的服务器可以获得到你所
发送的http请求时,就会造成信息的泄露

在浏览器中查看cookie的三种方式
1.在network中的请求报文以及响应报文中可以查看到,在响应报文发送回来的cookie中看到基本上都是server端更改了
之后的。
2.在application中可以查看到cookie,在相应的文件中你所看到的信息有
name  value  domain(存放的是可以访问的域名)  path(当前访问到的路径) expires/max-age存放的最大时间 
size表示存放的cookie大小

3.通过js修改cookie的方式  document.cookie = "k1=100"这种方式,但是这种方式不经常被使用 通过js修改的cookie的
方式是受到了一定限制的

cookie限制,在这一部分主要说明在server端中cookie的设置,首先
在app.js文件中去设置如何去获取到客户端的cookie,设置req.cookie去存放cookie值
具体的实现代码如下:
//解析cookie
    req.cookie = {};
    const cookieStr = req.headers.cookie || ''; //获取到的cookie形式为k1=value1;k2=value2
    cookieStr.split(';').forEach(ele => {
        if(!ele){
            return; //做兼容性的处理
        }
        const arr = ele.split("=");
        const key = arr[0];
        const val = arr[1];
        req.cookie[key] = val;
    });

然后在管理user的路由中去检查登录的状态,完成登录验证,通常情况下cookie是由前端发送在这里只需要去做一个
储存即可。具体检查登录验证的代码如下,只要所存入的cookie中有username即可。
if(method === 'GET' && req.path === '/api/user/login-test'){
        if(req.cookie.username){
            return Promise.resolve(new SuccessModel('req.cookie.username is ' , req.cookie.username));
        }
        return Promise.resolve(new ErrorModel('尚未登录'));
    }

在这里暂时将登录验证的请求方式通过后台来设置cookie缓存,因此在这里的代码实现如下:
if(method === 'GET' && req.path === '/api/user/login'){
        // const { username, password } = req.body;
        const { username, password } = req.query;
        const result =  UserMes(username ,password);
        return result.then(data => {
            console.log(username,password);
            if(data.username){
                res.setHeader('Set-Cookie',`username='${username}'; path='/';`);
                return new SuccessModel();
            }
            return new ErrorModel('登录失败');
        })
        // if(result){
        //     return new SuccessModel();
        // }else{
        //     return new ErrorModel('登录失败');
        // }
    }


cookie权限设置
1.给cookie做权限设置主要是为了让前端不能任意的对cookie做更改,保证cookie的安全性,具体设置权限
的方式是直接在后台设置路由的地方直接设置httpOnly。
2.在这里还需要注意的一点就是,当在给浏览器设置cookie时,需要我们手动的去除掉空格,如果不清除,
浏览器会自动的帮我们在设置cookie的地方自动的加上空格,这样会使得之后创建的cookie被前面的所覆盖
3.在这里我们还可以对cookie设置最大的缓存时间,具体的设置方式是通过setTime()和getTime()一起使用

具体的代码实现如下:
const getCookieExpires = () => {
    const d = new Date();
    d.setTime(d.getTime() + (24 * 60 * 60 * 1000));
    console.log('d.toGMTString() is ', d.toGMTString());
    return  d.toGMTString();
}
最后只需要在设置cookie的地方去调用这个方法即可。

session介绍与session设置
对于cookie设置产生的问题,如果在浏览器端直接去返回username,这样的方式会很容易就会暴露用户的信息,对于
这样的处理方式显然是不可取的。最好的方式就是cookie中储存userid(这个是随机生成的),server端去对应username
那么这个时候就需要去设置session。因此对于session可以概述为server端储存用户信息
1.在这里我们首先设置一个全局变量去存放session数据,其代码为const SESSION_DATA = {}
2.如何去解析session,需要去设置两个变量第一个是needSetCookie,第二个是userId,第一个变量用来判断是否需要去
设置cookie,第二个参数用于进行userId的设置。其逻辑大概如下所述: 1.首先判断是SESSION_DATA(userId)是否
存在,如果不存在就将其设置为一个空对象,如果存在就需要去设置userId,对于userId只需要将其赋值成一个时间戳加上
一个随机数,就可以生成一个唯一表示。最后只需要使用req.session = SESSION_DATA[userId];就可以去设置userId

具体的实现代码如下:
 //首先将req.cookie.userid赋值给uerId,在session中只需要判断cookie中是否存在userId即可
    let needSetCookie = false;
    let userId = req.cookie.userid;  //两者都是变量而不是常量
    if(userId){
        if(!SESSION_DATA[userId]){
            SESSION_DATA[userId] = {};
        }
    } else {
        needSetCookie = true;
        userId = `${Date.now()}_${Math.random()*10}`;
        SESSION_DATA[userId] = {};
    }
    req.session = SESSION_DATA[userId];

然后只需要在设置cookie的地方去设置cookie即可
 if(needSetCookie){
       res.setHeader('Set-Cookie',`userid='${userId}'; path='/'; httpOnly; expires=${getCookieExpires()}`);
}

最后在路由中去出处理session的设置,即在,路由中使用session去储存数据

猜你喜欢

转载自blog.csdn.net/care_yourself/article/details/101146273