1.cookie
cookie的特点
1 :服务器生成cookie可以设置cookie有效期等配置,把cookie返回给客户端,每次请求都会把cookie追加请求头里面返回给服务器
2:cookie存储在浏览器端,不安全,
3:浏览器关闭之后,再次打开会记录之前的状态
Cookie的使用
//先随机定义一个字符串作为cookie的值
var userInfo = {}
// 作为cookie的值
function getRandom(){
var str = "0123456789qwertyuioplkjhgfdsazxcvbnm"
var s = ""
for(var i = 0;i<20;i++){
s+= str[Math.floor(Math.random()*str.length)]
}
return s
}
//在需要的的位置进行在后台设置生成cookie
//登录成功
var cookValue = getRandom() //cookie值
// 服务器设置cookie maxAge指定cookie的有效时间
res.cookie("cookid",cookValue,{
maxAge:10000
})
// 先取cookie值,通过cookid来取
// 再可以userInfo取出req.body.user
userInfo[cookValue] = req.body.user
//在后端使用cookie进行对比验证
// 通过req.headers.cookie获取 字符串
// cookid=8on7w3wnohypjkctn6wi
if(req.headers.cookie){
var obj = cookie.parse(req.headers.cookie)
var cookieValue = obj.cookid
var user = userInfo[cookieValue]
//利用cookie找到之前登陆的用户
if(user){
res.send("欢迎来到"+user+"主页")
}else{
res.send("请先登录,亲")
}
}else{
// 不存在cookie
res.send("请先登录,亲")
}
2.session
session:存储服务端的缓存技术,基于cookie的,通过express-session模块进行配置session,会话存储,在浏览器关闭之后不会记录浏览器的状态。express-session不是内置模块需要先下载。
//首先要引入模块
var session = require("express-session")
//然后在app.js里使用
app.use(session({
//秘钥字符串
secret:"hello kitty",
// 是否重新保存session,如果为true,session的有效期的时间也会重置
// 如果为false,session有效期就是设置的时间,
resave:false,
// session的有效期
cookie:{
maxAge:10000
},
// 是否保存一些为初始化的session
saveUninitialized:false
}))
//在响应请求的时候获取数据名存入session
// 在请求数据获取session对象 user1是随便创建的属性
req.session.user1 = req.body.user
//在第二次请求时使用判断session的user1属性是否存在
router.get("/index",function(req,res,next){
if(req.session.user1){
res.send("欢迎来到"+req.session.user1+"主页")
}else{
res.send("请先登录")
}
})
//在退出时删除session的user1属性
//退出登录
router.get("/loginout",function(req,res,next){
if(req.session.user1){
delete req.session.user1
res.send("退出登录")
}else{
res.send("请先登录")
}
})
3.token
token 验证机制
var userInfo = {}
// 作为token的值
function getRandom() {
let str = 'asfykqwesadgdsffsdfsJFGHDSDFGGHFD'
let s = ''
for (let i = 0; i < 20; i++) {
s += Math.floor(Math.random() * str.length)
}
return s
}
1.服务端在登陆成功之后,生成token,并且以响应头/json数据返回给客户端
// 获得一个随机的token值
var token = getRandom()
// 在服务器做备份
userInfo[token] = req.body.user
// 把token放入响应头中,返回给客户端
res.setHeader("token",token)
res.json({code:1,data:"登陆成功"})
2.在客户端登录成功的回调里面拿到token,并且在客户端保存一份
$.ajax({
url:"/login",
data:{
user:i1.value,
psw:i2.value
},
method:"POST",
success:(res,state,xhr)=>{
//获取服务端响应头的数据
localStorage.setItem("token",xhr.getResponseHeader("token"))
location.href="/index.html"
}
})
3.在需要验证的的接口,把token发给服务器,在请求头或请求体发都可以
$.ajax({
url:"/index",
type:"get",
// 把token放在请求头里发给服务器
headers:{
"token":localStorage.getItem("token")
},
success:function(res){
console.log(res);
}
})
4.服务端在对应接口中得到token返回不同的数据
// 需要验证token
router.get("/index",function(req,res,next){
// req.headers.token 获取请求头里发来的token
// console.log(req.headers.token);
if (userInfo[req.headers.token]) {
// 成立证明登陆过了
res.json({
code:200,
data:req.headers.token
})
}else{
// 不存在
res.json({
code:201
})
}
})
5.最后在需要删除的接口中对token删除
// 退出登录
router.get("/loginout",function(req,res,next){
if (userInfo[req.headers.token]) {
delete req.headers.token
res.send("退出成功")
}else{
res.send("还没登录,请先登录")
}
})