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