精华内容
下载资源
问答
  • nodejs session的原理

    千次阅读 2018-10-17 18:28:54
    nodejs session的原理 Cookie HTTP协议是没有状态的,但是很多情况下是需要保存一些信息的。比如在用户登录后再次访问网站,没法判断用户是否已经登陆过。因此在这中情况下,我们需要一种数据结构来保存用户信息。...

    nodejs session的原理

    Cookie

    HTTP协议是没有状态的,但是很多情况下是需要保存一些信息的。比如在用户登录后再次访问网站,没法判断用户是否已经登陆过。因此在这中情况下,我们需要一种数据结构来保存用户信息。于是Cookies就诞生了。

    cookies用于在浏览器段保存用户信息。

    cookies的特点如下:

    • 保存在客户端浏览器
    • 大小最大为4Kb
    • 如果使用了cookies,访问域名时,浏览器会带上这个域名的cookies

    但用户每次向服务器提交信息时都会带上Cookis。Coolies的特性非常不好,比如要访问的是服务器上的静态资源,比如图片,改访问并不需要确认用户,然而浏览器还是会发送Cookis给服务器。

    Session

    Session的作用和Cookie差不多,但是Session是保存在服务器端的。前面提到用户通过Cookie向服务器提交用户信息,服务器拿到用户信息后该怎么验证呢?查询一下数据库??这样可以实现,但是如果每个用户每次访问都要提交从数据库验证一次,那么将对服务器性能的极大浪费。所以服务器端保存Session用来验证用户身份的合法性。

    Session的创建循序

    1. 生成全局唯一标示符
    2. 开辟数据存储空间。一般会在内存中开辟一块空间建立存储Session的数据结构,但是这样会有弊端:系统掉电,那么服务器端的Session将全部丢失。所以一般情况下会将Session保存在数据库或者文件夹中。
    3. 将Session的全局唯一标示符发送给客户端。

    现在的问题是服务器怎么将Session的标示符发送给客户端呢。根据HTTP协议,数据的发送可以放在请求行、头域或Body里。

    服务器发送给客户端浏览器Session的唯一标示符保存在客户端的Cookies中。

    Set-Cookie

    服务器返回浏览器的请求中设置Cookie。

    {
        "Set-Cookie": "session=r@rdegges.com"
    }
    

    服务器会返回一个set-cookie的消息,通知浏览器要设置cookie了,于是浏览器会根据set-cookie里的字段来设置信息了,比如上图的信息就会设置session=r@rdegges.com

    实战

    现在我们用client-session中间件来配置Session

    1. 安装模块
      var session = require('client-sessions');

    2. 配置session

    app.use(session({
        cookieName: 'session',  
        secret: 'random_string_goes_here', //一个随机字符串,因为客户端的数据都是不安全的,所以需要进行加密
        duration: 30*60*1000, //session的过期时间,过期了就必须重新设置
        activeDuration: 5* 60*1000, // 激活时间,比如设置为30分钟,那么只要30分钟内用户有服务器的交互,那么就会被重新激活。
    }))
    

    在Session中保存用户信息

    app.post('/login',function(req,res){
        User.findOne({email:req.body.email}, function(err,user){ //数据库中查找改用户
            if(!user){ //没有找到
                res.render('login.jade',{error:'用户名或密码错误!'})
            }else{
                if(req.body.password == user.password){
                    req.session.user == user //将user信息保存到Session中
                    res.redirect('/dashboard')
                }
            }else{
                res.render('login.jade',{error:'用户名或密码错误!'})
            }
        })
    })
    

    session层中间件

    我们可以会在对每个请求做如下的检查,但是我们完全可以不必这样做。

    app.use(function(req, res, next) {
      if (req.session && req.session.user)  {
        User.findOne({ email: req.session.user.email }, function(err, user) {
          if (user) {
            req.user = user;
            delete req.user.password; // delete the password from the session
            req.session.user = user;  //refresh the session value
            res.locals.user = user;
          }
          // finishing processing the middleware and run the route
          next();
        });
      } else {
        next();
      }
    });
    

    如果需要是用户登录后才能访问的页面,那么我们可以设计一个检查是否登录的中间函数。

    function requireLogin(req,res,next){
        if(!req.user){
            res.redirect('/login')
        }else{
            next();
        }
    }
    
    app.get('/dashboard',requireLogion,function(req,res){
        res.render('dashboard.jade)
    })
    

    安全性

    我们可以在登出时重置Session

    app.get('/logout',function(req,res){
        req.session.reset()
        res.redirect('/')
    })
    

    总结

    Cookie和Session有各自的优缺点

    1. 应用场景

    Cookie的典型应用为RememberMe 服务即用户的账户信息通过cookie的形式保存在客户端,当用户再次请求匹配的url时,账户信息会被传送到服务器端,交给相应的程序完成自动登录功能。当然亦可以保存一些客户端信息,如页面布局和搜索历史等。

    Session的典型应用场景是用户登录某网站之后,将其登录信息放入session,在以后的每次请求中查询相应的登录信息以确保该用户合法。当然还是有购物车等等经典场景;

    1. 安全性

    cookie将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差,一般情况下敏感信息是经过加密后存储在cookie中,但很容易就会被窃取。而session只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比cookie小了太多。

    Session安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,这在下文会进行更详细的说明。总体来讲,session的安全性要高于cookie;

    1. 性能

    Cookie存储在客户端,消耗的是客户端的I/O和内存,而session存储在服务端,消耗的是服务端的资源。但是session对服务器造成的压力比较集中,而cookie很好地分散了资源消耗,就这点来说,cookie是要优于session的;

    1. 时效性

    Cookie可以通过设置有效期使其较长时间内存在于客户端,而session一般只有比较短的有效期(用户主动销毁session或关闭浏览器后引发超时);

    1. 其他

    Cookie的处理在开发中没有session方便。而且cookie在客户端是有数量和大小的限制的,而session的大小却只以硬件为限制,能存储的数据无疑大了太多。

    参考https://segmentfault.com/a/1190000010837077

    展开全文
  • nodejs session 持久化说明 背景 一般我们用 req.session 可以在服务器放缓存,但这样的劣势是服务器更新这个缓存就会更新作废,这个我们在开发的时候就需要每次修改代码的时候重新获取缓存,而且发布在线上这也是一...

    nodejs session 持久化说明

    背景

    一般我们用 req.session 可以在服务器放缓存,但这样的劣势是服务器更新这个缓存就会更新作废,这个我们在开发的时候就需要每次修改代码的时候重新获取缓存,而且发布在线上这也是一个短板,所以我们就需要一个 session 持久化的方法,因为我这边用的是 mongodb 数据库,所以我就找了在这个数据库环境上的 session 持久化

    引包

    npm i -S connect-mongo mongose express-session
    

    配置

    app.use(session({
      secret:'keyboard cat', //加密字符串也可以写数组
      resave:true,     //强制保存session 建议设置成false
      saveUninitialized:true,  //强制保存未初始化的内容
      rolling:true, //动态刷新页面cookie存放时间
      // cookie:{maxAge:24*3600}, //保存时效
      store:new MongoStore({   //将session存进数据库  用来解决负载均衡的问题
          url:'mongodb://127.0.0.1/itcast', //将缓存数据放入数据库中
          touchAfter:24*3600 //通过这样做,设置touchAfter:24*3600,您在24小时内
         //只更新一次会话,不管有多少请求(除了在会话数据上更改某些内容的除外)
      })
    }))
    

    使用

    app.post('/',(err,req) => {
    	//赋值
    	req.session.user = user    
        //获取
        console.log(req.session.user)
    })
    

    测试

    EditThisCookie 这个插件是 Google 的插件,可以查看客户端的cookie信息

    代码案例

    github

    https://github.com/laocaiq/node_mongodb_express_dome

    码云

    https://gitee.com/lcai/node_mongodb_express_dome

    展开全文
  • NodeJs session 使用

    2019-09-18 05:28:12
    服务器接收请求参数,生成sessionId 将sessionId存储到客户端的cookie中 下一次客户端请求的时候带上cookie ,服务器获取cookie中的sessionId验证身份 响应验证通过的客户端,也就是登录成功的用户 使用方法: ...

    以登录为例

    基本实现原理:

    1. 客户端通过账号密码登录
    2. 服务器接收请求参数,生成sessionId 将sessionId存储到客户端的cookie中
    3. 下一次客户端请求的时候带上cookie ,服务器获取cookie中的sessionId验证身份
    4. 响应验证通过的客户端,也就是登录成功的用户

    使用方法:

    1. node.js中需要借助express-session实现session功能。使用 npm instsall express-session下载。
    2. 导入express-session模块 const session = require('express-session');
    3. 配置session
      app.use(session({
      secret: 'secret key', //使用随机自定义字符串进行加密
      saveUninitialized: false,//不保存未初始化的cookie,也就是未登录的cookie
      cookie: {
                  maxAge: 24 * 60 * 60 * 1000 //设置cookie的过期时间为1天
                  activeDuration: 5* 60*1000, // 激活时间,比如设置为30分钟,那么只要30分钟内用户有服务器的交互,那么就会被重新激活。
      }
      }))

      4.在用户登录的时候保存用户的信息

      app.post('/login', async (req,res) => {
          const { email, password } = req.body;
          let user = await User.findOne({ email: email });
          if (user.password == password){
              req.session.user = user;//登录成功将用户信息存储到session下面
              res.redirect('/home/');
          }else{
              res.render('login.art',{error:'账号或者密码错误'})
          }
      })
    展开全文
  • express是每个学习nodejs人必须掌握的框架,前阵子在学express的session内容中(express-session),遇到了一些问题,目前已解决,所以来分享一下心得! 首先先看看出现的错误 const express = require('express') ...

    express是每个学习nodejs人必须掌握的框架,前阵子在学express的session内容中(express-session),遇到了一些问题,目前已解决,所以来分享一下心得!

    首先先看看出现的错误

    这里他说username没有定义

    const express = require('express')
    const session = require('express-session')
    const app =express();
    // 配置session中间件
    app.use(
        session({
        secret:'keyboard cat',//服务端生成申明可随意写
        resave:true,//强制保存session即使他没有什么变化
        saveUninitialized:true,//强制将来初始化的session存储
        cookie:{//session是基于cookie的,所以可以在配置session的时候配置cookie|
            maxAge:1000*60,//设置过期时间
            secure:false//true的话表示只有https协议才能访问cookie
        }
    }))
    
    app.get("/put",(res,req)=>{
        req.session.username = "zhangshan"
        res.send("设置cookie成功!")
    })
    
    app.get("/get",(res,req)=>{
        console.log(req.session.username)
        res.send("获取cookie成功!");    
    })
    
    app.listen(3000)
    

    解决问题的办法是把req和res调换一下位置

    *** 原本的***
    在这里插入图片描述
    改后的
    在这里插入图片描述

    折行结果(正常)

    设置session
    在这里插入图片描述
    有cookie,原先是没有的
    在这里插入图片描述
    在这里插入图片描述
    命令行打印可以获取到session
    在这里插入图片描述

    最后奉上完整成功的代码
    const express = require('express')
    const session = require('express-session')
    const app =express();
    // 配置session中间件
    app.use(
        session({
        secret:'keyboard cat',//服务端生成申明可随意写
        resave:true,//强制保存session即使他没有什么变化
        saveUninitialized:true,//强制将来初始化的session存储
        cookie:{//session是基于cookie的,所以可以在配置session的时候配置cookie|
            maxAge:1000*60,//设置过期时间
            secure:false//true的话表示只有https协议才能访问cookie
        }
    }))
    
    app.get("/put",(req,res)=>{
        req.session.username = "zhangshan"
        res.send("设置cookie成功!")
    })
    
    app.get("/get",(req,res)=>{
        console.log(req.session.username)
        res.send("获取cookie成功!");    
    })
    
    app.listen(3000)
    
    展开全文
  • NodeJS Session持久化

    2018-12-13 21:27:31
    session默认是保存在服务器内存中, 不好管理, 服务器宕机后,所有session失效,用户需要验证身份 项目功能的拓展受到限制 const express = require("express"); const app = express()...
  • nodejs session 设计

    2014-04-01 13:09:00
    //保存会话 _data : {}, /** 会话基本操作 ***/ //查找会话 getSession : function(id){}, //创建会话 createSession : function(){}, //替换会话 replaceSession : function(...
  • nodeJs session记住登录信息

    千次阅读 2016-04-13 17:34:50
    //这句不能少 否则 会报错找不到 req.session.logged_in function (req, res, next) { console. log( "1" ); if ( '/' == req. url && req. session. logged_in) { res. writeHead( 200 , { '...
  • 翻译自:https://stormpath.com/blog/ev... 一 Cookie 因为HTTP协议是没有状态的,但很...于是就有了cookies,用于在浏览器端保存用户数据,它有如下特点1 是在客户端浏览器端才有的2 用于记录信息,大小最大为4K字...
  • 最后,cookie是标准实现,无所谓自己实现(你可能只是需要封装操作指令),要自己实现session的话,无非就是解决这几个问题: 1)决定你的帐本(用什么方式保存) 2) 实现写帐本(根据session_id写数据) 3) 实现读帐本(按...
  • session中间件用于为了保存用户数据提供一个session管理器。虽然session中的数据与cookie分开保存,但是session中的数据经过加密处理后默认保存在一个cookie中。因此,在使用session中间件之前必须使用cokieParser...
  • 1、express-session 2、body-parser 3、cookie-parser 4、ejs 模板 5、创建MySQL数据库 创建工程目录 app.js var express = require('express'); var app = express(); var path = require('path'); var session ...
  • 普通用法: 1 var express = require('express');... 2 var session = require('express-session'); 3 4 var app = express(); 5 6 app.use(session({ 7 name: 'test1', // 非常重要,...
  • session是另一种记录客户状态的机制,与cookie保存在客户端浏览器不同,session保存在服务器当中; 当客户端访问服务器时,服务器会生成一个session对象,对象中保存的是key:value值,同时服务器会将key传回给客户端...
  • http://wiki.jikexueyuan.com/project/node-lessons/cookie-session.html
  • 一 Cookie ...于是就有了cookies,用于在浏览器端保存用户数据,它有如下特点 1 是在客户端浏览器端才有的 2 用于记录信息,大小最大为4K字节 ...session类似服务器端的cookie,保存于服务器端,类似于
  • 基于nodejs使用session控制用户登录

    千次阅读 2017-01-15 17:21:24
    相信每一个前段技术人员对session storage与cookies都不会默认,那么如何在项目中使用cookies保存所需要的数据,做到登录控制呢?这里结合自己做过的一个项目给大家做一个说明。 session的本质基于cookies,在node...
  • Nodejs之使用session

    2019-09-22 07:40:14
    nodejs中使用session的说明。 session介绍 为什么使用session: session运行在服务器端,当客户端第一次访问服务器时,可以将客户的登陆信息保存。 当客户访问其他界面时,可以判断客户的登陆状态,做出提示。 ...
  • NodeJs怎样通过内存保存session? 本例就是建立于 Express v4.x and Socket.io 1.3.x 用(express-session)共享session...虽然nodejs已经到处都是了, 但session各种各样, 我觉得还是内存版本比较适合(个人观点)
  • nodejs设置session属性时报错Cannot set property ‘xxx’ of undefined 这几天在学习node的过程中,想设置session和cookie,从而保存用户的登录状态,但是中途发现老报错。 翻车现场 原因:session写的位置不对 ...
  • 前流行的“你画我猜”应用,你有没有想过使用HTML5来实现过?那么不可避免的需要解决canvas保存图片到硬盘或mongodb之类的数据库。本文主要介绍使用nodejs将html5 canvas ba...
  • 这几天在学 nodejs 的 express 框架,在登录时想保存用户名于是就想到用 session 存储,在网上搜到方法后写上去一直报错,结果是 session 写的位置不对。中间件 app.use(session())应该放在路由之前,我之前放在后面...
  • 请问, 服务器在生成session时,是给前端发送一把,自己在内存中保存一把,前端每次进入页面时会将自己的session发送给服务器,服务器再对比session
  • nodejs关于session和cookie的问题

    千次阅读 2016-01-13 12:05:31
    session_id 通常是存放在客户端的 cookie 中,比如在 express 中,默认是 connect.sid 这个字段,当请求到来时,服务端检查 cookie 中保存session_id 并通过这个 session_id 与服务器端的 session data 关联起来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,394
精华内容 1,757
关键字:

nodejssession保存