cookie和session的使用

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仍然具有一些局限性:

  1. 数据保存在客户端,相对不是太安全,容易被伪造或者盗用
  2. 单个Cookie的存储容量有限制,一般浏览器最大只能存储4kb。
  3. 每次请求都要携带较大数据进行网络传输,占用带宽。

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('启动成功');
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值