express如何使用session与cookie的方法(2)

cookie session 使用很简单就是我们在配置项中使用cookie配置项,就可以将session数据保存在cookie中,它和signedCookies类似都是将数据保存在客户端,而且都对数据进行了加密,但是加密后的请求得到的数据结构不一样。

cooke session 的结构如下:

Session { cookie: { path: 'https://www.jb51.net/', _expires: 2018-01-29T17:58:49.950Z, originalMaxAge: 60000, httpOnly: true }, isFirst: 1 }

signedCookie 结构如下:

{ isFirst: '1' }

实现cookie session代码如下:

var path = require('path'); var express = require('express'); var session = require('express-session'); var redisStore = require('connect-redis')(session); var app = express(); // session app.use(session({ name: 'session-name', // 这里是cookie的name,默认是connect.sid secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串 resave: true, saveUninitialized: false, cookie: { maxAge: 60 * 1000, httpOnly: true } })); // route app.get('https://www.jb51.net/', function(req, res, next) { if(req.session.isFirst || req.cookies.isFirst) { res.send("欢迎再一次访问"); } else { req.session.isFirst = 1; res.cookie('isFirst', 1, { maxAge: 60 * 1000, singed: true}); res.send("欢迎第一次访问。"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });

signed-cookie vs cookie session

signedCookies 信息可见但不可修改,cookie session不可见也不可修改

signedCookies 信息长期保存客户端,后者客户端关闭,信息消失

针对Cooke session增加了客户端请求的数据规模,我们一般这样使用,数据库存储session。

数据库保存session

用数据库保存session,我们一般使用redis,因为它是缓存数据库,查询速度相较于非缓存的速度更快。

express-session 的实例代码如下:

var path = require('path'); var express = require('express'); var session = require('express-session'); var redisStore = require('connect-redis')(session); var app = express(); // session app.use(session({ name: 'session-name', // 这里是cookie的name,默认是connect.sid secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串 resave: true, saveUninitialized: false, store: new redisStore({ host: '127.0.0.1', port: '6379', db: 0, pass: '', }) })); // route app.get('https://www.jb51.net/', function(req, res) { if (req.session.isFirst) { res.send("欢迎再一次访问。"); console.log(req.session) } else { req.session.isFirst = 1; res.send("欢迎第一次访问。"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });

但有时我们也使用非redis数据库保存session,这时我们就需要对项目结构有深刻的认识和理解;否则,使用后反而会适得其反。

另外,我们要注意使用数据库保存session数据,在浏览器端的session-id会随着浏览器的关闭而消失,下次打开浏览器发送请求时,服务器依然不能识别请求者的身份。

cookie session 虽然能解决这个问题,但是它本身存在着安全风险,其实cookie session 和 signedCookies都面临xss攻击。

其实,使用signedCookies和session的结合会在一定程度上降低这样的风险。

signedCookies(cookies) 和 session的结合

在开发中,我们往往需要signedCookies的长期保存特性,又需要session的不可见不可修改的特性。

var path = require('path'); var express = require('express'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var redisStore = require('connect-redis')(session); var app = express(); // 使用 cookieParser 中间件; app.use(cookieParser()); // session app.use(session({ name: 'session-name', // 这里是cookie的name,默认是connect.sid secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串 resave: true, saveUninitialized: false, // cookie: { maxAge: 60 * 1000, httpOnly: true }, store: new redisStore({ host: '127.0.0.1', port: '6379', db: 0, pass: '', }) })); app.get('https://www.jb51.net/', function(req, res, next) { if(req.session.isFirst || req.cookies.isFirst) { res.send("欢迎再一次访问"); } else { req.session.isFirst = 1; res.cookie('isFirst', 1, { maxAge: 60 * 1000, singed: true}); res.send("欢迎第一次访问。"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });

这样我们将session保存在redis中的信息,保存在了session_id所标示的客户端cooke中一份,这样我们就不用担心,浏览器关闭,cookie中的session_id字段就会消失的情况,因为浏览器中还有它的备份cookie,如果没有备份的cookie信息,下次客户端再次发出请求浏览就无法确定用户的身份。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ppfyj.html