树莓派局域网:利用cookie与session的保存登录状态

首先在树莓派上安装两个nodejs模块:

sudo npm install express-session --save
//session控制
sudo npm install cookie-parser --save
//cookie读取操作

Session:一般保存在服务器内存中,也可以保存至硬盘上。用于存储仍在会话中的用户,保证用户在打开同网站下其他页面时,不用重新登陆。大小基本没有限制。由于储存在服务端,安全性比较高。

Cookie:保存在用户硬盘上。用于重新打开该网站时,从客户端发送给服务端进行验证信息,达到免登录步骤的效果。大小限制根据浏览器不同,在4095~4097字节不等。因为存储在服务端,安全性较低,需要利用进行签名的方法,利用hash值的手段防止篡改。

设置中间件

紧接着,在app.js中为cookie读取和session的存贮设置中间件

app.use(cookieParser('mobilePiClass')); //自定义签名
//登录信息是需要加密的,如果传递不加密cookie,使用不带参数的
//app.use(cookieParser());
app.use(session({
  secret: 'mobilePiClass',
  resave: false,
  saveUninitialized: true
}));
//同样也要为session加密

中间件一般有以下几个特点:

  • 封装了处理某个事件的函数
  • 实现的功能具有通用性
  • 搭建了从require到文件的桥梁

登陆成功后发送cookie

发送cookie只需要很简单的res.cookie()函数:

res.cookie("user", {  
            "username": name, 
            "identity": identity
          }, {
            path: '/',
            signed: true,
            httpOnly: true,
            maxAge: 30 * 24 * 60 * 60 * 1000 
          });

第一个参数是cookie的名称,以字符串传递;
第二个参数是cookie的值,既可以是值,也可以是对象。如果是对象,取cookie的时候取出来的也是对象。
第三个参数是其他设置,其中path是允许访问cookie的路径,signed是是否签名,如果设置cookie中间件时有传入参数,那么才可以设置为true

读取cookie并保存session

if (req.session.username && req.session.identity) {
    //如果已存在session,要做的事(进入页面等)
  } else {
    let cookieInfo = req.signedCookies["user"];
    if (cookieInfo) {
     //如果session不存在,cookie已存在,要做的事
     //例如先将cookie的信息存入session中,在进入页面
    } else {
      //如果session和cookie均不存在,要做的事
      //提示访问非法、跳转登录界面等s
    }
  }

利用类似的逻辑,封装成函数,便可以嵌入路由中,在登录界面以及需要登录才能进入的界面前快速判断用户是否已经处于登录状态。

退出登录

router.get('/process_logout', function(req, res) {
  req.session.destroy(function(err) {
    if (err) {
      console.log("用户退出失败!")
      return;
    }
    res.clearCookie("user");
    console.log("用户成功退出");
    res.end("成功退出");
  });
});

先删除回话,然后删除cookie,接着在静态页面的js脚本中回调刷新页面或者回到登录页面的方法,便可以清除登录数据、重新登录了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注