express中的cookie和session
一、无状态的http
http是无状态协议, 简单的说, 当你浏览了一个页面, 然后转到同一个网站的另一个页面, 服务器无法认识到,
这是同一个浏览器在访问同一个网站,换句话说,服务器无法识别两条http请求是否是同一个用户发送的。也就是说服务器端并没有记录通信状态的能力。
但是, 为了用户体验, 我们确实需要让服务器能够记忆用户的一些信息。 cookie应运而生
二、cookie
cookie是一个简单到爆的想法: 当访问一个页面的时候,服务器在下行http报文中,命令浏览器存储一个字符串;浏览器再访问同一个域的时候,将把这个字符串携带到上行http请求中。
第一次访问第一个服务器,不可能携带cookie。必须是服务器得到这次请求,在下行响应报头中,携带cookie信息,此后每一次浏览器往这个服务器发出的请求,都会携带这个cookie
cookie特点:
1.cookie 是不加密的,用户可以*看到
2.用户可以删除cookie或者禁用它
3.cookie可以被篡改
4.cookie可以用于攻击
5.cookie 存储量很小。
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
session在计算机网络应用中被称为“会话控制”,
客户端浏览器访问网站的时候,服务器会向客户浏览器发送一个每个用户特有的会话编号sessionID,让他进入到cookie里,服务器同时也把sessionID和对应的用户信息、用户操作记录在服务器上,这些记录就是session。客户端浏览器再次访问时,会发送cookie给服务器,其中就包含sessionID。服务器从cookie里找到sessionID,再根据sessionID找到以前记录的用户信息就可以知道他之前操控些、访问过哪里。
Session不是一个天生就有的技术,而是依赖cookie
session是存在服务器端的技术,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)
上一篇: 「NOIP2017模拟赛07.31」倒水
推荐阅读
-
express中的cookie和session
-
JavaWeb - jsp,el表达式,会话管理,cookie,session技术,session的创建和销毁/清空购物车
-
Session和Cookie的概念及在Express框架中的使用
-
《Cookie案例3》——————使用Cookie记录登录的用户名,并用Session获取到用户名
-
php学习笔记(二十六)php中session的初步使用(基于cookie的)
-
JSP中session的简单应用——以购物车为例
-
jsp页面获取session中的值
-
springMVC中JSP页面获取Session的值
-
Cookie和Session&JSP (学习)
-
jsp页面中获取session中的值