http是无状态协议, 简单的说, 当你浏览了一个页面, 而后转到同一个网站的另外一个页面, 服务器没法认识到, 这是同一个浏览器在访问同一个网站,换句话说,服务器没法识别两条http请求是不是同一个用户发送的。也就是说服务器端并无记录通讯状态的能力。 可是, 为了用户体验, 咱们确实须要让服务器可以记忆用户的一些信息。 cookie应运而生redis
cookie是一个简单到爆的想法: 当访问一个页面的时候,服务器在下行http报文中,命令浏览器存储一个字符串;浏览器再访问同一个域的时候,将把这个字符串携带到上行http请求中。数据库
第一次访问第一个服务器,不可能携带cookie。必须是服务器获得此次请求,在下行响应报头中,携带cookie信息,此后每一次浏览器往这个服务器发出的请求,都会携带这个cookieexpress
cookie特色:npm
express中的cookie,你确定能想到。 res负责设置cookie, req负责识别cookie。 在express中的使用:cookie-parser浏览器
1/安装
npm i -S cookie-parser
复制代码
cookie 中间件的参数:
path:指定 cookie 影响到的路径
expires: 指定时间格式
maxAge:指定 cookie 何时过时
secure:当 secure 值为 true 时,在 HTTPS 中才有效;反之,cookie 在 HTTP 中是有效。
httpOnly:浏览器不容许脚本操做 document.cookie 去更改 cookie。设置为true能够避免被 xss 攻击拿到 cookie
复制代码
const cookieParser = require('cookie-parser');
app.use(cookieParser());
app.get("/a", (req, res) => {
console.log(req.cookies) //读取cookie
res.cookie("amount", 99.8, { //设置cookie
//domain:设置主域名//(子域名能够找主域名,主域名不能够找子域名;通常状况下一个网站一个cookie)
//path:"/" //cookie是保存在根路径下的,为了防止访问不到 (不能往下访问只能往上访问)
//secure: 当 secure 值为 true 时, 在 HTTPS 中才有效; 反之, cookie 在 HTTP 中是有效。
//httpOnly:浏览器不容许脚本操做 document.cookie 去更改 cookie。设置为true能够避免被 xss 攻击拿到 cookie
maxAge: 14 * 86400 * 1000 //有效期
})
res.send("ok")
})
复制代码
简单模拟登陆
const cookieParser = require('cookie-parser');
app.use(cookieParser(
"ggffdaasadada123ghgfhf8gghgh" //签名
));
app.get("/a", (req, res) => {
let num = 0;
console.log(req.cookies) //读取未签名cookie
console.log(req.signedCookies) //读取签名cookie
if (req.cookies.amount) {
res.send("欢迎回来")
} else {
res.cookie("amount", "hello", {
maxAge: 14 * 86400 * 1000, //有效期
signed: true //是否须要签名的
})
}
res.send("请先登陆")
})
复制代码
session在计算机网络应用中被称为“会话控制”, 客户端浏览器访问网站的时候,服务器会向客户浏览器发送一个每一个用户特有的会话编号sessionID,让他进入到cookie里,服务器同时也把sessionID和对应的用户信息、用户操做记录在服务器上,这些记录就是session。客户端浏览器再次访问时,会发送cookie给服务器,其中就包含sessionID。服务器从cookie里找到sessionID,再根据sessionID找到之前记录的用户信息就能够知道他以前操控些、访问过哪里。安全
Session不是一个天生就有的技术,而是依赖cookiebash
session是存在服务器端的技术,cookie是存储在客户端的技术服务器
cookie以文本格式存储在浏览器上,存储量有限;而会话存储在服务端,能够无限量存储多个变量而且比cookie更安全cookie
session相比cookie而言要安全一些,由于他是存储在服务器的;cookie是明文(也可加密)存储在客户端(浏览器),并且每次请求都会附带发送(可使用抓包工具获取cookie,不安全)网络
cookie若是存储内容比较多的话,会给请求形成压力 session由于是存储在服务器的,因此若是过多的依赖session会形成服务器压力(内存和硬盘的压力)
1/安装
npm i -S express-session
复制代码
2/session 中间件的配置参数:
name: 设置cookie中,保存session的字段名称,默认为connect.sid
store: session的存储方式,默认为存放在内存中,咱们能够自定义redis等
genid: 生成一个新的session_id时,默认为使用uid2这个npm包
rolling: 每一个请求都从新设置一个cookie,默认为false
resave: 即便session没有被修改,也保存session值,默认为true
saveUninitialized:强制未初始化的session保存到数据库
secret: 经过设置的secret字符串,来计算hash值并放在cookie中,使产生的signedCookie防篡改
cookie : 设置存放sessionid的cookie的相关选项
复制代码
2.const express = require("express");
const app = express();
const session = require("express-session");
app.use(session({
secret : 'secret', // 对session id 相关的cookie 进行签名
resave : true,
saveUninitialized: false, // 是否保存未初始化的会话
cookie : {
maxAge : 1000 * 60 * 3, // 设置 session 的有效时间,单位毫秒
},
}));
app.get("/", (req, res) => {
// console.log(req.session);
if (!req.session['view']) {
req.session['view'] = 1;
} else {
req.session['view']++;
}
req.session['amount'] = 99.8;
res.send(`欢迎你第${req.session["view"]}次登录,你的余额是:${req.session['amount']}`)
})
app.listen(3000)
复制代码