您的位置:首页 > 其它

基于Express框架的会话控制

2017-08-24 17:28 106 查看
会话控制
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");
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: