express学习笔记之(cookie,session)

cookie

cookie就是储存在用户本地终端上的数据
**1. cookie保存在浏览器本地,只要不过期关闭浏览器也会存在。
2. 正常情况下cookie不加密,用户可轻松看到
3. 用户可以删除或者禁用cookie
4. cookie可以被篡改
5. cookie可用于攻击
6. cookie存储量很小,大小一般是4k
7. 发送请求自动带上登录信息
**
开始使用

设置cookie

基础设置cookie,有效期默认为1个会话,就是浏览器关掉,这个cookie就会消失

// 比如使用cookit 设置一个值
router.get('/setCookie',(req,res)=>{
// 使用 res.cookie ,并且设置失效时间 比如10秒,还可以设置 httpOnly: true 代表在浏览器就不可以使用js代码获取cookie
// domain: "ccc.com" 代表设置域名,设置了这个,就可以实现对相应路由下多个二级路由的cookie进行共享
  res.cookie('isLogin','true', {maxAge:10000 , httpOnly: true}, domain: "ccc.com")
  res.send('cookie设置成功')
})

然后去查看这个请求,会发现在响应头,请求头那里都能看到这个设置的数据
在这里插入图片描述
在这里插入图片描述
其实这里就是为了了解到在
比如,在我们登录时设置一个值,在登录后,去进行浏览商品的请求的时候,就会检测本地cookie有没有这个值,有就代表还是登录的
获取cookie中的cookie信息
1. domain: 域名
2. name=value:键值对,可以设置要保存的 Key/Value,注意这里的 name 不能和其他属性项的名字一样
3. Expires: 过期时间(秒),在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT。
4. maxAge: 最大失效时间(毫秒),设置在多少后失效 。
5. secure: 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效 。
6. Path: 表示 在那个路由下可以访问到cookie。
7. httpOnly:是微软对 COOKIE 做的扩展。如果在 COOKIE 中设置了“httpOnly”属性,则通过程序(JS 脚本、applet 等)将无法读取到COOKIE 信息,防止 XSS 攻击的产生 。
8. singed:表示是否签名cookie, 设为true 会对这个 cookie 签名,这样就需要用 res.signedCookies 而不是 res.cookies 访问它。被篡改的签名 cookie 会被服务器拒绝,并且 cookie 值会重置为它的原始值。

比如设置

获取cookie

router.get('/admin',(req,res)=>{
// 使用req.cookies
  if (req.cookies.isLogin == 'true') {
    res.send('登录成功')
  }else{
    res.send('登录失败')
  }
})

可以在请求头看到信息
在这里插入图片描述

cookie加密

只需要在app.js设置

// 解析cookie
app.use(cookieParser('secret'));

然后再设置cookie的时候,设置参数

// 设置cookie
router.get('/setCookie',(req,res)=>{
  res.cookie('isLogin','true',{signed:true})
  res.send('cookie设置成功')
})

// 获取加密后的cookie
router.get('/admin',(req,res)=>{
  if (req.cookies.isLogin == 'true') {
    res.send('登录成功')
  }else{
    res.send('登录失败')
  }
})

直接对cookie值加密

node为我们提供了一个核心安全模块“crypto”,它提供了很多安全相关的功能,如摘要运算、加密、电子签名等。

// 导入包

// 加密
router.get('/bb',(req,res)=>{
  let password = 'a1245869004'
  // 使用加密算法
  let sf = crypto.createHash('md5')
  // 进行加密
  sf.update(password)
  // 把加密的二进制以字符串的形式输出
  let content = sf.digest('hex')
  res.send(content)
})

加密在正常开发中的使用简述

// 定义一个对象来通过加密后的值为键值,加密前的值作为值
let secrtCookit={}

// 设置上面那个方法
function setSecrtCookie(str,secretStr){
  secrtCookit[secretStr] = str
}

//通关加密后的值作为键值拿到加密前的值
function getSecrtCookie(secretStr){
  return secrtCookit[secretStr]
}

// 进行加密
let randomNum = Math.random()*10
router.get('/appSecrt',(req,res)=>{
  let str = 'a1245869004' + randomNum
  let content = jiami(str)
  // 给cookie设置值
  res.cookie('login',content)
  // 设置 secrtCookit 对象
  setSecrtCookie(str,content)
  res.send('加密成功+')
})

// 拿到加密前的值
router.get('/get',(req,res)=>{
  let strSecrt = req.cookies.login
  let str = getSecrtCookie(strSecrt)
  res.send(str)
})


// 首先封装好加密的方法
function jiami(str){
  // 使用加密算法
  let sf = crypto.createHash('md5')
  // 进行加密
  sf.update(str)
  // 把加密的二进制以字符串的形式输出
  let content = sf.digest('hex')
  return content
}

session的使用

**
一,session是另一种记录客户状态的机制,与cookie保存在客户端浏览器不同,session保存在服务器当中;**
**
二、当客户端访问服务器时,服务器会生成一个session对象,对象中保存的是key:value值,
同时服务器会将key传回给客户端的cookie当中;
当用户第二次访问服务器时,就会把cookie当中的key传回到服务器中,最后服务器会吧value值返回给客户端。
**
**
三、因此上面的key则是全局唯一的标识,客户端和服务端依靠这个全局唯一的标识来访问会话信息数据。
**
要使用session,需要安装他

// 导入后配置session
// 配置session
app.use(session({
  // 配置盐,作用就是对session里面的数据的值进行添加一些自定义的值,来进行加密
  secret:'sdadad',
  // 是否把session存起来
  resave:true,
  // 保存初始化
  saveUninitialized:true,
  cookie:{
    // 这里是对cookie的设置
  }
}))
// 用到session,就是在传输过程中再加密一层
router.get('/session',(req,res)=>{
  req.session.name = '小明'
  req.session.level = '1'
// 还可以设置超出时间
req.session.cookie.maxAge = 1000
   res.send('登录状态已经设置到session中')
})
router.get('/getSesson',(req,res)=>{
  res.send(req.session.name  + '<a href="/aabb">退出登录</a>')
})
// 销毁session 退出登录
router.get('/aabb',(req,res)=>{
  // 销毁session,比如退出登录
  req.session.destroy( ()=>{
  console.log('退出成功')
  })
  res.send('退出成功')
})

再浏览器中,cookit的信息是这样的,下面蓝色的代表着信息id
在这里插入图片描述

写一个登录失败从新回到登录页面

// 登录页面
router.get('/',(req,res)=>{
  render('index.ejs')
})
// 判断用户是否为数据库存在的用户的中间件
async function isUser(req,res,next){
  let strsql = 'select * from user where name=? and passWord =?'
  // 把提交过来的form表单与数据进行查询
  let arr = [req.body.name,req.body.passWord]
  let result = await aamysql(strsql,arr)
  if (result.length>0) {
    next()
  }else{
    res.send('错误')
  }
}
// 用到session,就是在传输过程中再加密一层
router.post('/login',isUser,(req,res)=>{
    req.session.name = req.body.name
    res.send('登录成功');
})

function isLogin(req,res,next){
  if (req.session.name == undefined) {
    res.render('aa.ejs',{
      title:'进入失败',
      content:'未登录,请登录',
      href:'/',
      hrefText:'登录页面'
    })
  }else{
    next()
  }
}

router.get('/getSesson',isLogin,(req,res)=>{
  res.send(req.session.name  + '<a href="/aabb">退出登录</a>')
})
// 销毁session 退出登录
router.get('/aabb',(req,res)=>{
  // 销毁session,比如退出登录
  req.session.destroy( ()=>{
  console.log('退出成功')
  })
  res.send('退出成功')
})

index.ejs

    <form action="/login" method="POST">
      <input type="text" name="name"/>
      <input type="password" name="passWord"/>
      <button type="submit">登录</button>
    </form>

aa.ejs

  <h1><%- title %></h1>
  <h3><%- content %></h3>
  <p><span class="num">2</span>秒后跳转到<a href="<%- href %>"><%- hrefText %></a></p>
  <script>
    n = 2
    setInterval(() => {
      n--
      if (n<0) {
        location.href = "<%- href %>"
      }else{
        document.querySelector('.num').innerHTML = n
      }
    }, 2000);
  </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值