1. Cookie
1.1 设置Cookie
对于cookie的创建,express直接提供了API,只需要在需要使用的地方调用即可:
// 导入express模块
const express = require('express');
// 基于express创建服务器
const app = express();
app.get('/', function (req, res) {
// 这里可以直接设置cookie
res.cookie('xxx', '666');
res.send('我好帅啊!');
})
app.listen(80, '127.0.0.1', function () {
console.log('启动成功');
});
当然了,Express内置的Cookie设置API还支持其它属性的设置,这些属性都在res.cookie()方法的第三个参数中传递:
domain:cookie在什么域名下有效,类型为String,。默认为网站域名
expires: cookie过期时间,类型为Date。如果没有设置或者设置为0,那么该cookie只在这个session有效,即关闭浏览器后,这个cookie会被浏览器删除。
httpOnly: 只能被web server访问,类型Boolean,如果在 COOKIE 中设置了“httpOnly”属性,则通过程序(JS 脚本、applet 等)将无法读取到COOKIE 信息,防止 XSS 攻击产生 。
maxAge: 实现expires的功能,设置cookie过期的时间,类型为String,指明从现在开始,多少毫秒以后,cookie到期。
path: cookie在什么路径下有效,默认为 ‘/’ 根目录,类型为String
secure:只能被HTTPS使用,HTTP协议下无效,类型Boolean,默认为false
signed:表示是否签名cookie, ,类型Boolean,默认为false。express会使用req.secret来完成签名,需要cookie-parser配合使用。设为true 会对这个 cookie 签名,这样就需要用 res.signedCookies 而不是 res.cookies 访问它。被篡改的签名 cookie 会被服务器拒绝,并且 cookie 值会重置为它的原始值
使用例子:
const express = require('express');
const app = express();
app.get('/', function (req, res) {
// res.cookie('xxx', '666', );
// 设置9000毫秒后过期
// res.cookie('yyy', '888', { maxAge: 9000, httpOnly: true})
// cookie的值可以是对象,中文会自动处理
res.cookie('zzz', {name: '二狗子'});
res.send(req.headers.cookie);
})
app.listen(80, '127.0.0.1', function () {
console.log('启动成功');
});
1.2 读取Cookie
1.2.1 原生读取
req.headers.cookie
1.2.2 使用cookie-parser 中间件读取
安装:
npm install cookie-parser --save
使用:
// 导入express模块
const express = require('express');
// 基于express创建服务器
const app = express();
// 引入中间件模块
const cookieParser = require('cookie-parser');
// 注册中间件
app.use(cookieParser());
app.get('/', function (req, res) {
// 获取cookie(其值直接转成了对象)
res.send(req.cookies);
})
app.listen(80, '127.0.0.1', function () {
console.log('启动成功');
});
1.3 删除cookie
const express = require('express');
const app = express();
// 引入中间件模块
const cookieParser = require('cookie-parser');
// 注册中间件
app.use(cookieParser());
app.get('/', function (req, res) {
// 删除某个cookie
res.clearCookie('name');
res.send('666');
});
app.listen(80, '127.0.0.1', function () {
console.log('启动成功');
});
1.4 cookie的缺点
虽然使用Cookie将数据存储在客户端,可以达到跟踪用户的目的(解决由HTTP协议无状态引起的问题),但是Cookie仍然具有一些局限性:
- 数据保存在客户端,相对不是太安全,容易被伪造或者盗用
- 单个Cookie的存储容量有限制,一般浏览器最大只能存储4kb。
- 每次请求都要携带较大数据进行网络传输,占用带宽。
2. Session
为了解决这个局限性,Session应允而生。Session将用户的会话数据存储在服务端,没有大小限制。Session其实也是基于Cookie实现改进的。其原理是:服务端为请求生成一个sessionid作为服务端数据存储的标识,然后将sessionid放到客户端的cookie中,下次请求的时候,由于cookie中携带的sessionid会一并发来,服务端可以根据sessionid去Session存储区域找到对应的数据。在express中一般使用express-session
中间件处理session,当然也有其他解决方案。
安装:
npm i express-session --save
使用:
const express = require('express');
const app = express();
// 引入中间件模块
const session = require('express-session');
// 注册中间件
app.use(session({
// 加密字符串,可以随意写
secret: 'shusheng',
// 这里的name值得是cookie的name,可以不设置,默认cookie的name是:connect.sid
// name: 'ss',
// cookie: {
// // 设置maxAge是800000ms,即800s后session和相应的cookie失效过期
// maxAge: 800*1000,
// },
// 强制将session数据保存到 session store中
resave: false,
// 强制将未初始化的session数据保存到store中,默认为true
saveUninitialized: false
}));
app.get('/', function (req, res) {
// 注册中间件后就可以使用req.session进行数据设置了
req.session.userInfo = {
name: '二狗子',
hobby: ['看书', '写字'],
girl: {
name: '小红',
age: 18
}
}
res.end();
})
app.get('/user', function (req, res) {
// 访问session数据
console.log(req.session);
})
app.get('/logout', function (req, res) {
// 销毁session
req.session.destroy(function () {
// 销毁后的回调函数
res.redirect('http://www.baidu.com')
})
})
app.listen(80, '127.0.0.1', function () {
console.log('启动成功');
});