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>