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

 

 

转载于:https://www.cnblogs.com/xzsz/p/9525344.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值