zoukankan      html  css  js  c++  java
  • nodejs-5.7 express-session

    express-session
    官网: https://github.com/expressjs/session

    ★cookie 和 session 的区别:

    两者都通常用于保存用户状态用来验证用户身份;

    cookie 是存储在浏览器端的.
    session 是存储在服务器端的.

    与cookie相比,用session来存储用户个人信息,cookie可以看到用户id之类的,而session在本地客户端只能看到唯一的随机字符串,相对来说比较安全(互联网没有绝对安全)。

    建议:将登陆信息等重要信息存放为session、其他信息如果需要保留,可以放在cookie中

    ☆ nodejs 存储 session 的位置, 是在内存中。每一个登陆用户对应一个 session 信息。


    1. 安装 cnpm install express-session --save


    2. 引入并设置
      var session = require('express-session'); 

      app.use(session({
        secret: 'dsfadsafdassadfasdf', //加密 ,必填参数
        resave: false, //选填参数 不加会报警告(重写)
        //resave:true 强制将session数据进行重写,反之亦然
        saveUninitialized: false, // 选填参数 不加会报警告(初始化)
        //saveUninitialized: false 用到session时才会去初始化
        //saveUninitialized: true 不管用不用到session都会初始化
        cookie: { maxAge: 600000 },  //session 的实现是默认依赖 cookie
        name: 'niubibu'   //session名称
      }));

    各参数意义:
    secret:用来对session数据进行加密的字符串.这个属性值为必须指定的属性。
    name:表示cookie的name,默认cookie的name是:connect.sid。

    cookie: 设置存放 session id 的 cookie 的相关选项,默认为 (default: { path: '/’, httpOnly: true, secure: false, maxAge: null })       maxAge:cookie过期时间,毫秒。

    resave:是指每次请求都重新设置session cookie,假设你的cookie是6000毫秒过期,每次请求都会再设置6000毫秒。
    saveUninitialized: 是指无论有没有session cookie,每次请求都设置个session cookie ,默认给个标示为 connect.sid。

    3.  设置session: req.session.username = 'lisi';

     获取session: req.session.username

     用于销毁session: req.session.destroy(function(err){ //console.log('shanchu') }) 

    4. session原理:

    nodejs 中, session 的实现是默认依赖 cookie。`HttpOnly` 声明该cookie 只能用来进行网络传输, 本地无法操作该 cookie. 禁止浏览器修改 cookie

    • httpOnly:是微软对COOKIE做的扩展。如果在COOKIE中设置了“httpOnly”属性,则通过程序(JS脚本、applet等)将无法读取到COOKIE信息,防止XSS攻击产生

    5. 实例链接代码

    (1)session设置获取

    var express =require('express');
    var session = require('express-session');
    
    var app = express();
    
    app.use(session({
      secret: 'dsfadsafdassadfasdf', //加密 ,必填参数
      resave: false, //选填参数  不加会报警告(重写)
      //resave:true 强制将session数据进行重写,反之亦然
      saveUninitialized: false,// 选填参数  不加会报警告(初始化)
      //saveUninitialized: false 用到session时才会去初始化 
      //saveUninitialized: true 不管用不用到session都会初始化 
      cookie: { maxAge: 600000 },//session 的实现是默认依赖 cookie
      name: 'niubibu'
    }));
    
    //设置静态资源目录
    app.use(express.static('public'));
    
    app.set('view engine','ejs');
    app.set('views','views');
    
    //路由
    app.get('/setSession', function(req,res){
      //设置session
      req.session.username = 'admin';
    
      res.end('set session');
    })
    
    //读取session
    app.get('/getSession', function(req, res){
      console.log(req.session.username);
      res.end('get session');
    })
    
    app.listen(80);

     

    (2) 模拟登陆操作设置session验证实例:

    需求:

    // GET /home 网站首页 /detail 商品详情页 不需要登陆
    // GET /admin 网站后台 必须要登陆   验证session
    // GET /login 显示登陆页面
    // POST /login 检测用户参数 账号:admin 密码:admin   登陆成功设置session

    var express =require('express');
    var session = require('express-session');
    var formidable = require('formidable');
    
    var app = express();
    
    app.set('view engine','ejs');
    app.set('views','views');
    
    app.use(session({
      secret: 'dsfadsafdassadfasdf', //加密 ,必填参数
      resave: false, //选填参数  不加会报警告(重写)
      //resave:true 强制将session数据进行重写,反之亦然
      saveUninitialized: false,// 选填参数  不加会报警告(初始化)
      //saveUninitialized: false 用到session时才会去初始化 
      //saveUninitialized: true 不管用不用到session都会初始化 
      cookie: { maxAge: 600000 },//session 的实现是默认依赖 cookie
      name: 'niubibu'//session名称
    }));
    
    // GET /home 网站首页   /detail 商品详情页    不需要登陆
    // GET /admin 网站后台  必须要登陆
    // GET /login  显示登陆页面
    // POST /login  检测用户参数  账号:admin  密码:admin
    
    //首页
    app.get('/home', function(req,res){
      res.setHeader('content-type','text/html;charset=utf-8');
      res.end('网站首页!!!');
    });
    
    //详情页
    app.get('/detail', function(req,res){
      res.setHeader('content-type','text/html;charset=utf-8');
      res.end('商品详情页!!!');
    });
    
    //后台首页
    app.get('/admin', function(req,res){
      //检测用户的身份  设置session:admin=1&id=19
      if(req.session.admin == 1 && req.session.id) {
        res.setHeader('content-type','text/html;charset=utf-8');
        res.end('网站后台!!!');
        return;
      }
    
      res.redirect('/login');
    });
    
    //显示登陆
    app.get('/login', function(req, res){
      res.render('login');
    });
    
    //登陆操作
    app.post('/login', function(req, res){
      //获取用户参数
      var form = new formidable.IncomingForm();
        form.parse(req, function(err, fields, files) {
          //判断
          if(fields.username == 'admin' && fields.password == 'admin'){
          res.setHeader('content-type','text/html;charset=utf-8');
            //登陆成功
            //写入session
            req.session.admin = 1;
            req.session.id = 20;
    
            //3秒后跳转后台页面:第一种方法
            // res.redirect('/admin');
            // res.end(`登陆成功<script>setTimeout(function(){
            //  location.href= "/admin";
            // },3000)</script>`);
            // 
            //3秒后跳转后台页面:第二种方法
            res.render('success',{info: '登陆成功', time: 10000, url: '/admin'});
          } else {
            res.redirect('/login');
          } 
        });
    }); 
    
    
    //设置静态资源目录
    app.use(express.static('public'));
    
    app.set('view engine','ejs');
    app.set('views','views');
    
    
    app.listen(80);
    app2.js
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>登陆页面</title>
    </head>
    <body>
      <form action="/login" method="POST">
        <input type="text" name="username">
        <input type="text" name="password">
        <button>登陆</button>
      </form>
    </body>
    </html>
    login.ejs
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title><%= info %></title>
    </head>
    <body>
      <h1 style="font-size:50px">
        :)
      </h1>
      <h2><%= info %></h2>  
      <p><%= time/1000 %> 秒之后跳转</p>
    
      <script>
        setTimeout(function(){
          location.href = '<%= url %>';
        }, <%= time %>);
      </script>
    </body>
    </html>
    success.ejs

     

     

  • 相关阅读:
    死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
    死磕 java同步系列之AQS起篇
    死磕 java同步系列之自己动手写一个锁Lock
    死磕 java同步系列之synchronized解析
    死磕 java同步系列之volatile解析
    死磕 java同步系列之JMM(Java Memory Model)
    解决Linux下SSH超时自动断开
    Git常用命令
    JVM常用虚拟机命令汇总
    理解GC日志
  • 原文地址:https://www.cnblogs.com/xzsz/p/9525344.html
Copyright © 2011-2022 走看看