基于Express框架的会话控制
2017-08-24 17:28
106 查看
会话控制
Cookie
session
服务器不能区分出两次请求是否发送自同一个客户端;但是在实践开发中确实有该需求,而且十分的迫切;
会话控制主要采用两个技术Cookie和Session;
cookit的使用
类比看电影:
1、电影院发票;
2、用户取票;
3、检票,用户带票入场;
cookie的使用流程:
1、服务器向浏览器发送cookie;
2、浏览器收到并将cookie保存;
3、浏览器带着cookie向服务器发票;
4、检查用户的cookie.
cookie是什么?
![](https://img-blog.csdn.net/20170911204220249?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXV0b3VhZmFuZ3pp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
实际上就是一个头,服务器以响应头的形式将cookie发送给浏览器;
浏览器以请求头的形式将cookie发回给服务器;
我们可以通过为不同的用户发送不同的cookie来识别出用户;
cookie的有效期
cookie也是有有效期的,浏览器并不会一直保存Cookie;
cookie的默认有效期是一次会话,会话指的是一次打开关闭浏览器的过程,一旦关闭浏览器cookie则会自动失效;
设置cookie的有效期;
cookie的设置
通过npm下载cookie-parser;
配置好express框架;
将cookieParser设置为中间件
通过express框架中的res,res.cookie(name, value [, options]);设置cookie;
可以通过express框架中的req读取cookie;
cookie的删除
可以设置同样名称的属性,maxAge设置为0;
使用clearCookie
cookie的作用
1、保存用户的登录状态;
2、保存用户的用户名;
3、广告
1、cookie都是明文保存的,容易泄露用户的隐私;
2、浏览器对于cookie的数量和大小都是有限制的,不能使用cookie保存过多的信息;
3、cookie是由服务器发送给浏览器,再由浏览器发回给服务器,如果cookie过大会导致请求速度过慢,降低用户的体验;
为了解决cookie的缺陷所以引入了session机制,session像银行卡,我们将钱存入到银行的账户中,通过账号和账户进行管理
session是基于cookie的,如果没有cookie,session无法使用;
![](https://img-blog.csdn.net/20170911204418017?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXV0b3VhZmFuZ3pp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
session的原理:
session将用户的数据统一保存到服务器中的一个对象里,每一次会话都会有一个对应的对象用来保存数据,每一个session对象都会有一个唯一的id,我们会将id以cookie的形式发送给浏览器,浏览器只需要在发送请求时将cookie发回,即可找到它对应的session对象;
session中数据的有效期就是一次会话,浏览器关闭session中的数据自动丢失;
session的删除:
session的应用
我们可以在用户登陆成功以后,将用户的信息保存到session对象中,这样我们就可以通过检查session中是否有用户信息,来判断用户是否登录。
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"); });
相关文章推荐
- 基于Express框架的会话控制
- 基于Express框架的会话控制
- 基于Express框架的会话控制
- 基于Express框架的会话控制
- 基于Express框架的会话控制
- 基于Express框架的会话控制
- 基于角色的权限控制在springMVC框架中的实现
- 会话控制(基于Coookie,session和Url)
- 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(七)基于CrossApp跨平台框架的MQTT客户端控制应用android版
- spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架
- QuickCSharp框架开发(16)------基于角色的访问控制(验证思路回顾)
- 用协程手动控制基于Lua的两种框架:Codea和Love2D的流程
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--权限控制
- Express 基于 Node.js 平台,快速、开放、极简的 web 开发框架。
- 一:express框架学习之路由控制与中间件
- 基于Express框架使用POST上传文件
- 基于RBAC访问控制框架Shiro简介