我以前的文章有写过,咱们知道在H5的本地存储没出来以前,前端须要存储的数据基本用cookie来存储,并且cookie能在服务端与浏览器之间进行数据传送,当服务端把一些用户信息返回给前端后,前端须要存起来,方便调用,可是他存的数据有限,只能存4k的数据量前端
cookie机制:node
cookie实际上是补充http协议的无状态性的缺点,底层是经过服务器端在http响应消息中增长set-cookie字段来将cookie信息发送给浏览器端,由于它只能存4k,通常用来存浏览器的身份信息,浏览器在访问服务器的某些资源的时候,会在http请求头中将cookie数据传给服务器,这样服务器就知道是谁请求的了,可是若是用户清除了cookie,那就啥都没有啦...mysql
session是存在服务器端的,主要配合cookie完成浏览器的身份认证和状态ajax
他相对于cookie较安全点,当用户请求服务器的时候,服务器会把数据临时存下来,若是退出网站后,session会被销毁,sql
可是,若是架集群的时候,也就是服务器作负载均衡的时候,session就不妙了,
此时的session就没法共享,可能会提示你session无效,实际上是存在另一台服务器上的,
固然也能够放在数据库中,可是不多有人这么作,由于若是高并发的时候会不停地调数据库 ,很麻烦,数据库
因此通常不多把session存到内存或数据库,若是有10000人登陆那么会占服务器或数据库不少内存,可能会致使服务器崩掉.express
sessionId跟咱们编程不要紧 是服务端自动种下的,等到服务器把sessionId经过set-cookie传给客户端,客户端会自动把sessionId在传给服务器,编程
因此,现代的后端都是经过token来开发的...json
Token 后端进行身份验证的票据:后端
一、用户登陆,发送用户名、密码
二、服务端收到后,进行验证用户名和密码
三、验证成功后,生成一个token票据,并发送给客户端
四、客户端得到token票据后,存储起来,等到再次请求的时候,把token做为参数传给服务器
五、服务端收到到,对token进行验证,成功后进行业务处理,不成功则提示信息失效
token能够存到数据库中,若是同一个帐号在不一样的机器A,B进行登陆,A先登陆,保存了了一个token,B机器在登陆的时候,会把该用户的token删除从新生成,那么A机器的用户token失效,等到再次请求的时候,带着失效的token去查询数据库,查不到,就登陆失效了。从新登陆
例如咱们作一个例子: nodejs + express + mysql
首先,咱们本地链接数据库
var mysql = require('mysql'); //查询 传入查询条件 和 回调函数 const select = function(){ var connection = mysql.createConnection({ host : 'localhost', user : 'root', password: '', database: 'testToken' }); connection.connect(); //链接数据库 connection.query(sql,callback); //业务处理 connection.end() //断开与数据库的链接 } //添加 const insert = function(sql,params,callback){ var connection = mysql.createConnection({ host : 'localhost', user : 'root', password: '', database: 'testToken' }); connection.connect(); var query = connection.query(sql,params,callback) connection.end() } //暴露 module.exports = { select, insert }
而后咱们设置路由,并生成token,进行业务处理
var express = require('express') var md5 = require('md5') var router = express.Router(); var dbtools = require('./mysql/dbtools.js') var queryCon = `select * from users where username='${req.query.username}' and psw='${req.query.psw}'` router.get('/api/login', function(req, res, next) { dbtools.select(queryCon,function(err, result){ if(err){ console.log(err) return; } console.log(result); if(result){ var token = md5(new Date().getTime()) //若是用户token存在,把这个用户的token须要先删除.... dbtools.insert('INSERT INTO token SET ? ',{username: req.query.username, token: token }, function(err) { if(!err) { res.json({username: req.query.username, token: token}); } } ) }else{ res.send('登陆失败') } }) }) module.exports = router;
回调地狱啊,改造改造...
router.get('/api/login', saveUserInfo); const saveUserInfo = function(req, res, next){ return new Promise(function(resolve, reject){ dbtools.select(`select * from users where username='${req.query.username}' and psw='${req.query.psw}'`, function(err, results){ if(err) { console.log(err); return; } if(results){ resolve(res, req) }else{ res.send('登陆失败') } }) }) } saveUserInfo.then(function(res, req){ var token = md5(new Date().getTime()); dbtools.insert("INSERT INTO token SET ?", {username: req.query.username, token: token }, function(err) { if(!err) { res.json({username: req.query.username, token: token}); } } ) }) module.exports = router;
此时打开浏览器测试 http:localhost:8080/api/login?username='abc'&psw='123'
返回{username: 'abc',token:98763394034384kdijghya78fd9fd9fd}
最后,咱们把获取的token保存下来,等的请求时放到http的请求头中
例如: $.ajax({ url: '/api/user/', data: username, header: {'Accept': 'aplication/json','Authorization':token} success:function(res){ console.log(res) } })
好了,相信各位大兄弟姐妹理解的差很少了,若是有什么见解,能够私信,互相学习交流...