身份验证 session-cookie
身份验证
HTTP是一种没有状态的协议,也就是它并不知道是谁访问。客户端用户名密码通过了身份验证,不过下次这个客户端再发送请求的时候还得验证。
Session会话支持
会话:一种持久的网络协议,用于完成服务器和客户端之间的一些交互行为。
一次会话可能会包含多次链接,每次连接都会被认为是会话的一次操作。HTTP 协议是无状态的,本身不支持会话,因此在没有额外手段的帮助下,前面场景中服务器不知道用户购买了什么。
为了在无状态的HTTP协议之上实现会话,cookie诞生了。Cookie是一些存储在客户端的信息,每次连接的时候由浏览器向服务器递交,服务器也向浏览器发起存储cookie的请求。
服务器生成一个唯一标识符并发送给客户端浏览器,浏览器将这个唯一标识符存储在 Cookie 中,以后每次再发起请求,客户端浏览器都会向服务器传送这个唯一标识符,服务器通过这个唯一标识符来识别用户。 对于开发者来说,我们无须关心浏览器端的存储,需要关注的仅仅是如何通过这个唯一标识符来识别用户。很多服务端脚本语言都有会话功能,如 PHP,把每个唯一标识符存储到文件中。
Session和cookie交互的过程
1、客户端用户名跟密码请求登录
2、服务端收到请求,去数据库验证用户名与密码
3、验证成功后,服务端种一个cookie或发一个字符到客户端,同时服务器保留一份session
4、客户端收到 响应 以后可以把收到的字符存到cookie
5、客户端每次向服务端请求资源的cookie会自动携带
6、服务端收到请求,然后去验证cookie和session,如果验证成功,就说明客户端已经登录
后端保存信息给浏览器
服务器给浏览器一个cookie:cookie-parser中间件(express脚手架已经集成)
服务器给浏览器cookie的同时在服务器上生产session:cookie-session中间件。
安装cookie-session中间件
npm i cookie-seeion -S
在app.js 中引入
// 服务器 支持session 前后端不分离 let cookieSession = require('cookie-session') app.use( cookieSession({ secret: "zz2003", //对session id 相关的cookie 进行签名 cookie: { maxAge: 20 * 60 * 1000 },// 设置 session 的有效时间,单位毫秒 resave: true, //重新保存:强制会话保存即使是未修改的。默认为true但是得写上 saveUnintialized: true, // 是否保存未初始化的会话 }) );
在脚手架中routes/index.js中写下:
/* GET home page. */ // get localhost:3000 router.get('/', function(req, res, next) { console.log('index') console.log(req.session) // 当用户访问首页的时候,服务器会生成一个session 信息保存到客户端里面 console.log(req.session.id) //session 的唯一标识符 身份证,会已加密的形式在用户电脑上存一份,服务器内存也会存一份 // 我们也可以在在sesson中存信息,只要是同一个用户session里的信息会保存到服务器 //用户第一次访问的时候我们在session中存 一个views=1 记录用户的访问次数 //用户不是第一次访问的时候我们让views++ if(req.session.views){ req.session.views++ }else{ req.session.views = 1; } // req.session.isLogin = true //在页面中把views的值渲染到页面上 // res.render('index', { title: 'Express',views:req.session.views }); // });
在index.ejs中可以将view渲染到页面上,代码如下:
<!DOCTYPE html> <html> <head> <title><%= title %></title> <link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body> <h1><%= title %></h1> <p>Welcome to <%= title %></p> <p>您的访问次数 <%= views %></p> </body> </html>
在服务上执行的结果如下:
Cookie中也有值:
每刷新一次终端中会更新一次
这种机制sessionid 也就是登录凭证是服务器 偷偷存在浏览器的,客户端不需要做什么操作!客户端在登录网站的时候,服务器偷偷存到浏览器!