基于Express框架的会话控制

会话控制

  • http协议是一个无状态的协议;
  • 服务器不能区分出两次请求是否发送自同一个客户端;但是在实践开发中确实有该需求,而且十分的迫切;
  • 会话控制主要采用两个技术Cookie和Session;
  • Cookie相当于服务器发送给浏览器的一张票,服务器将cookie发送给浏览器后,浏览器每次访问都会将cookie发回,这样服务器就可以根据浏览器发回的cookie来识别出不同的用户了。
  • cookit的使用
    • 类比看电影:
      • 1、电影院发票;
      • 2、用户取票;
      • 3、检票,用户带票入场;
    • cookie的使用流程:
      • 1、服务器向浏览器发送cookie;
      • 2、浏览器收到并将cookie保存;
      • 3、浏览器带着cookie向服务器发票;
      • 4、检查用户的cookie.
  • cookie是什么?
    这里写图片描述
    • 实际上就是一个头,服务器以响应头的形式将cookie发送给浏览器;
    • 浏览器以请求头的形式将cookie发回给服务器;
    • 我们可以通过为不同的用户发送不同的cookie来识别出用户;
  • cookie的有效期
    • cookie也是有有效期的,浏览器并不会一直保存Cookie;
    • cookie的默认有效期是一次会话,会话指的是一次打开关闭浏览器的过程,一旦关闭浏览器cookie则会自动失效;
    • 设置cookie的有效期;
  • cookie的设置

    • 通过npm下载cookie-parser;
    • 配置好express框架;
    • 将cookieParser设置为中间件

      //将cookieParser设置为中间件
      app.use(cookieParser());
    • 通过express框架中的res,res.cookie(name, value [, options]);设置cookie;

      //设置一个十分钟有效的cookie
      //res.cookie("name","sunwukong",{maxAge:1000*60*10});
      //设置一个永久有效的cookie
      res.cookie("name","sunwukong",{maxAge:1000*60*60*24*365*10});
      //示例:
      app.get('/sendCookie',function (req,res) {
          //向客户端发送cookie:res.cookie(name, value [, options])
      res.cookie("name","sunwukong",{maxAge:1000*60*10});
      res.send("Cookie已经发送给浏览器~~~");
      })
    • 可以通过express框架中的req读取cookie;

      app.get('/checkCookie',function (req,res) {
      //获取用户发送的cookie
      var cookie = req.get('Cookie');
      console.log(req.cookies);
      //当通过res.cookie,设置完cookie后再次访问服务器,可以得到cookie:{ 'Webstorm-65f0180d': '55600384-8e0d-481e-807c-35344570ed7f',name: 'sunwukong' }
      //以及req.cookies.name为sunwukong;
        console.log(req.cookies.name);//undefined
      res.send('检查用户的Cookie');
      })
  • cookie的删除

    • 可以设置同样名称的属性,maxAge设置为0;

      res.cookie('name','shaheshang',{maxAge:0});
    • 使用clearCookie

       res.clearCookie('name');
  • cookie的作用
    • 1、保存用户的登录状态;
    • 2、保存用户的用户名;
    • 3、广告
//cookie的完整示例代码
var express = require('express');
var app = express();

//引入cookie-parser
var cookieParser = require('cookie-parser');


//将cookieParser设置为中间件
app.use(cookieParser());

app.get('/checkCookie',function (req,res) {
   //获取用户发送的cookie
   var cookie = req.get('Cookie');
   // console.log(cookie);//Webstorm-65f0180d=55600384-8e0d-481e-807c-35344570ed7f
   //当引入cookie-parser以后,在Request中会多一个cookies这个属性。这个属性值是一个对象,它会将cookie中解析的内容转换为对象中的属性.
   console.log(req.cookies);//{ 'Webstorm-65f0180d': '55600384-8e0d-481e-807c-35344570ed7f' }
   //当设置完 res.cookie("name","sunwukong",{maxAge:1000*60*10});后再次访问服务器,可以得到cookie:{ 'Webstorm-65f0180d': '55600384-8e0d-481e-807c-35344570ed7f',name: 'sunwukong' }
   //以及req.cookies.name为sunwukong;
    console.log(req.cookies.name);//undefined
    res.send('检查用户的Cookie');
})

app.get('/sendCookie',function (req,res) {
    //向客户端发送cookie:res.cookie(name, value [, options])
    res.cookie("name","sunwukong",{maxAge:1000*60*10});
    res.send("Cookie已经发送给浏览器~~~");
})
app.listen(3000,function () {
    console.log('ok');
})
//一个cookie的练习
var express = require('express');
var app = express();
var bodyParser = require('body-parser');

//引入cookie-parser
var cookieParser = require('cookie-parser');

app.set('view engine','ejs');
app.set('views','views');

//将cookieParser设置为中间件
app.use(cookieParser());
//bodyParser中间件用来解析http请求体,是express默认使用的中间件之一。
//使用express应用生成器生成一个网站,它默认已经使用了 bodyParser.json 与 bodyParser.urlencoded 的解析功能,除了这两个,bodyParser还支持对text、raw的解析。
//bodyParser.urlencoded是用来解析我们通常的form表单提交的数据,也就是请求头中包含这样的信息: Content-Type: application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({extended:false}));
//映射表单的路由
app.get('/login',function (req,res) {

    res.render("views.ejs",{cookies:req.cookies});
})

//映射一个处理表单的路由
app.post('/login',function (req,res) {
    //获取用户名和密码
    var username = req.body.username;
    var password = req.body.password;
    console.log(req.body);//{ username: 'admin', password: '123123' }
    console.log(username);
    console.log(password);
    //验证用户名和密码是否正确
    //密码只要是123123 全都登录成功
    if(password == "123123"){
        //登录成功
        //将username作为cookie发送给客户端
        res.cookie("username",username,{maxAge:1000*60*60*24*30});
        res.send("<h1>登录成功</h1>");
    }else{
        //登录失败
        res.send("<h1>用户名或密码错误</h1>");
    }
})

app.listen(3000,function () {
    console.log('ok');
})


//views.ejs文件
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <title>Document</title>
</head>
<body>
<h3>欢迎登录</h3>
<form action="/login" method="post">
    用户名 <input type="text" name="username" value="<%=cookies.username%>"> <br /><br />
    密码 <input type="password" name="password"> <br /><br />
    <input type="submit" value="登录"> <br /><br />
</form>
</body>
</html>

session

  • cookie的不足
    • 1、cookie都是明文保存的,容易泄露用户的隐私;
    • 2、浏览器对于cookie的数量和大小都是有限制的,不能使用cookie保存过多的信息;
    • 3、cookie是由服务器发送给浏览器,再由浏览器发回给服务器,如果cookie过大会导致请求速度过慢,降低用户的体验;
  • 为了解决cookie的缺陷所以引入了session机制,session像银行卡,我们将钱存入到银行的账户中,通过账号和账户进行管理
  • session是基于cookie的,如果没有cookie,session无法使用;
    这里写图片描述
  • session的原理:
    • session将用户的数据统一保存到服务器中的一个对象里,每一次会话都会有一个对应的对象用来保存数据,每一个session对象都会有一个唯一的id,我们会将id以cookie的形式发送给浏览器,浏览器只需要在发送请求时将cookie发回,即可找到它对应的session对象;
  • session中数据的有效期就是一次会话,浏览器关闭session中的数据自动丢失;

  • session的删除:

    //登录成功,将用户信息保存到session中
    req.session.loginUser = loginUser;
    //将session中的loginUser删除
    delete req.session.loginUser;
  • session的应用

    • 我们可以在用户登陆成功以后,将用户的信息保存到session对象中,这样我们就可以通过检查session中是否有用户信息,来判断用户是否登录。
//session讲解
var express = require("express");
var app = express();
var bodyParser = require("body-parser");
//引入express-session
var session = require("express-session");

//引入cookie-parser
var cookieParser = require("cookie-parser");

app.set("view engine" , "ejs");
app.set("views" , "views");
//将cookie-parser设置为中间件
app.use(cookieParser());
//将session设置为中间件
app.use(session({
    resave:false,
    saveUninitialized:false,
    secret:"hello"
}));


app.use(bodyParser.urlencoded({extended:false}));


//创建一个路由来测试session
app.get("/test01",function (req , res) {

    console.log(req.session);
    /*Session {
     cookie:
     { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }*/

    //set-cookie: connect.sid=s%3AhwfdjKPhxN3cwXhde3vBaMHPhBelGixH.rYDSaLmxxD3j6vXYmiWgms3bxF3SyDy98igyQtKoCyU; Path=/; HttpOnly
    req.session.str = "向session存储的数据";

    res.send("测试session");
});

app.get("/test02",function (req , res) {

    res.send(req.session.str);
});


app.listen(3000,function () {
    console.log("OK");
});

猜你喜欢

转载自blog.csdn.net/mutouafangzi/article/details/77533002
今日推荐