nodejs-5.7 express-session

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

★cookie 和 session 的区别:node

二者都一般用于保存用户状态用来验证用户身份;git

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

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

建议:将登录信息等重要信息存放为session、其余信息若是须要保留,能够放在cookie中npm

☆ 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名称
  }));cookie

各参数意义:
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
相关文章
相关标签/搜索