一、代码
var express = require('express');
// 首先引入 express-session 这个模块
var session = require('express-session');
var app = express();
app.listen(5000,function(res){
console.log('listening');
});
// 按照上面的解释,设置 session 的可选参数
app.use(session({
secret: 'recommand 128 bytes random string', // 建议使用 128 个字符的随机字符串
cookie: { maxAge: 60 * 1000 },
name: 'session_id'
}));
app.get('/', function (req, res) {
// 检查 session 中的 isVisit 字段
// 如果存在则增加一次,否则为 session 设置 isVisit 字段,并初始化为 1。
if(req.session.isVisit) {
//req.session.isVisit++;
res.send('<p>第 ' + req.session.isVisit + '次来此页面</p>');
} else {
req.session.isVisit = 1;
res.send("欢迎第一次来这里");
console.log(req.session);
}
});
二、此处写下自己的测试结果
Cookie
概述:
在HTTP协议中,制定了Cookie机制,用于实现
客户端和服务器之间的状态共享,
Cookie是解决HTTP无状态性的有效手段,服务器可以设置(set-cookie)或读取cookie中所包含的信息
实现原理:
客户端第一次请求:服务器端如果需要记录用户信息(就是用户需要存session 如:$SESSION['username'] = 'test'), 才会在响应信息中返回 Set-cookie 响应头,如果没有存入用户信息,也就是没有session操作时,不会返回Set-cookie响 应头。当然再次访问页面时,会在请求头中,带上cookie,如图二
如图一:
当第一次访问时,有服务器对session赋值操作,所以响应头会返回set-cookie.,我们再次访问时,继续看图
图二、
由于服务器没有对session进行操作,所以响应头也就没有设置set-cookie。
session存入Redis中(持久化存储)
connect-reids 是一个 Redis 版的 session 存储器,使用node_redis作为驱动。借助它即可在Express中启用Redis来持久化你的Session.
npm install connect-redis
参数
- client 你可以复用现有的redis客户端对象, 由 redis.createClient() 创建
- host Redis服务器名
- port Redis服务器端口
- socket Redis服务器的unix_socket
可选参数
- ttl Redis session TTL 过期时间 (秒)
- disableTTL 禁用设置的 TTL
- db 使用第几个数据库
- pass Redis数据库的密码
- prefix 数据表前辍即schema, 默认为 "sess:"
var express = require('express');
var app = express();
app.listen(5000,function(res){
console.log('listening');
});
var session = require('express-session');
var redis = require('redis');
var redisClient = redis.createClient('6379', '127.0.0.1');
var RedisStore = require('connect-redis')(session);
app.use(session({
secret:'signkey',
store:new RedisStore({client:redisClient}),
resave:false,
saveUninitialized:false,
name:'session_id'
}));
//测试
app.use(function (req,res,next) {
if(!req.session){
return next(new Error('error'));
}
next();
});
app.get('/', function (req, res) {
// 检查 session 中的 isVisit 字段
// 如果存在则增加一次,否则为 session 设置 isVisit 字段,并初始化为 1。
if(req.session.isVisit) {
req.session.isVisit++;
req.session.username = 'test';
res.send('<p>第 ' + req.session.isVisit + '次来此页面</p>');
} else {
req.session.isVisit = 1;
res.send("欢迎第一次来这里");
console.log(req.session);
}
});
这样session就会转移到redis数据库中, 为什么可以保证持久化呢,因为express服务器突然重启时,用户仍然可以使用当前Cookies里的sessioniD、从数据库获取他的会话状态,做到会话不丢失,提高了网站的健壮性