node中Session持久化与Redis缓存

一、代码

 
  
  1. var express = require('express');
  2. // 首先引入 express-session 这个模块
  3. var session = require('express-session');
  4. var app = express();
  5. app.listen(5000,function(res){
  6. console.log('listening');
  7. });
  8. // 按照上面的解释,设置 session 的可选参数
  9. app.use(session({
  10. secret: 'recommand 128 bytes random string', // 建议使用 128 个字符的随机字符串
  11. cookie: { maxAge: 60 * 1000 },
  12. name: 'session_id'
  13. }));
  14. app.get('/', function (req, res) {
  15. // 检查 session 中的 isVisit 字段
  16. // 如果存在则增加一次,否则为 session 设置 isVisit 字段,并初始化为 1。
  17. if(req.session.isVisit) {
  18. //req.session.isVisit++;
  19. res.send('<p>第 ' + req.session.isVisit + '次来此页面</p>');
  20. } else {
  21. req.session.isVisit = 1;
  22. res.send("欢迎第一次来这里");
  23. console.log(req.session);
  24. }
  25. });

二、此处写下自己的测试结果

    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:"
 
   
  1. var express = require('express');
  2. var app = express();
  3. app.listen(5000,function(res){
  4. console.log('listening');
  5. });
  6. var session = require('express-session');
  7. var redis = require('redis');
  8. var redisClient = redis.createClient('6379', '127.0.0.1');
  9. var RedisStore = require('connect-redis')(session);
  10. app.use(session({
  11. secret:'signkey',
  12. store:new RedisStore({client:redisClient}),
  13. resave:false,
  14. saveUninitialized:false,
  15. name:'session_id'
  16. }));
  17. //测试
  18. app.use(function (req,res,next) {
  19. if(!req.session){
  20. return next(new Error('error'));
  21. }
  22. next();
  23. });
  24. app.get('/', function (req, res) {
  25. // 检查 session 中的 isVisit 字段
  26. // 如果存在则增加一次,否则为 session 设置 isVisit 字段,并初始化为 1。
  27. if(req.session.isVisit) {
  28. req.session.isVisit++;
  29. req.session.username = 'test';
  30. res.send('<p>第 ' + req.session.isVisit + '次来此页面</p>');
  31. } else {
  32. req.session.isVisit = 1;
  33. res.send("欢迎第一次来这里");
  34. console.log(req.session);
  35. }
  36. });
这样session就会转移到redis数据库中,  为什么可以保证持久化呢,因为express服务器突然重启时,用户仍然可以使用当前Cookies里的sessioniD、从数据库获取他的会话状态,做到会话不丢失,提高了网站的健壮性

猜你喜欢

转载自blog.csdn.net/angle_jian/article/details/79240622