会话控制
- http协议是一个无状态的协议;
- 服务器不能区分出两次请求是否发送自同一个客户端;但是在实践开发中确实有该需求,而且十分的迫切;
- 会话控制主要采用两个技术Cookie和Session;
Cookie
-
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");
});