NodeJS之设置Cookie和Session

2019/8/28 NodeJSCookie

🌙 NodeJS之设置Cookie和Session

🌙 1.Cookie概念

http是一个无状态的协议,cookie就是一种浏览器管理状态的一个文件,它有name,也有value,第一次访问网站的时候,浏览器发出请求,服务器响应请求后,会将cookie放入到响应请求中,在浏览器第二次发请求的时候,会把cookie带过去,服务端会辨别用户身份,当然服务器也可以修改cookie内容。

//读取浏览器中的cookie
console.log(document.cookie);
//写入cookie
document.cookie='myname=laihuamin;path=/;domain=.baidu.com';
1
2
3
4

把cookie聊清楚 (opens new window)

🌙 2.Session概念

Cookie机制弥补了HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。

与Cookie不同的是,session是以服务端保存状态的。通过cookie将sessionId保存在cookie中,浏览器下次请求携带这个cookie(也就是seeeionId),这样服务器通过sessionId就可以获取用户相应的信息了。即:

  • 如果已包含这个sessionId,则说明以前已经为此客户端创建过session,服务器就按照sessionId把这个session检索出来使用(如果检索不到,可能会新建一个),获取用户信息。

  • 如果客户端请求不包含sessionId,则为此客户端创建一个session并且生成一个与此session相关联的sessionId

你真的了解 Cookie 和 Session 吗

🌙 3.NodeJS操作cookie

🌙 3.1 espress框架操作cookie

前提是使用cookie-parser中间件,后面会介绍。

  • res.cookie(name, value [, options])

    options属性 类型 描述
    domain String cookie的域名。默认为应用程序的域名。
    encode Function 为cookie设置编码的同步函数。默认为encodeURIComponent
    expires Date cookie的有效期(以GMT表示)。如果未指定或设置为0,则创建session cookie。
    httpOnly Boolean 将cookie标记为只能由web服务器访问。
    maxAge Number 设置cookie有效时长(ms)。
    path String cookie的路径,默认 '/'
    secure Boolean 将cookie设置为仅用于HTTPS。
    signed Boolean 指示是否应该对cookie进行签名。
    sameSite Boolean or String Set-Cookie 属性SameSite的值. 更多:https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00#section-4.1.1.
    // 设置cookie
    res.cookie('name', 'tobi', { domain: '.example.com', path: '/admin', secure: true })
    res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true })
    res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true })
    
    // 清空cookie
    res.clearCookie('name', { path: '/admin' })
    
    // 设置多个cookie
    res
      .status(201)
      .cookie('access_token', 'Bearer ' + token, {
        expires: new Date(Date.now() + 8 * 3600000) // cookie will be removed after 8 hours
      })
      .cookie('test', 'test')
      .redirect(301, '/admin')
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    express4x框架res.cookie (opens new window)

  • req.cookies

    req.cookies.name
    
    1

    express4x框架req.cookies (opens new window)

🌙 3.2 前提是使用cookie-parser中间件

# 安装
npm i cookie-parser
1
2
var express = require('express')
var cookieParser = require('cookie-parser')
 
var app = express()
// 挂载cookie-parser
app.use(cookieParser())
 
app.get('/', function (req, res) {
  // Cookies that have not been signed
  console.log('Cookies: ', req.cookies)
 
  // Cookies that have been signed
  console.log('Signed Cookies: ', req.signedCookies)
})
 
app.listen(8080)
 
// curl command that sends an HTTP request with two cookies
// curl http://127.0.0.1:8080 --cookie "Cho=Kim;Greet=Hello"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

🌙 4.NodeJS设置session

🌙 4.1 安装express-session

npm install express-session
1

🌙 4.2 使用express-session

var session = require('express-session')
var express = require('express')

var app = express()
app.set('trust proxy', 1) // trust first proxy
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}))

app.get('/', function(req, res) {
    if(req.session.login) {
       res.send('欢迎光临:' + req.session.username);
    } else {
        res.send('你还未登陆');
    }
});

app.get('/login', function(req, res) {
    // 设置session
    req.session.login = true;
    req.session.username = 'haha';
    res.send('你已经成功登陆')});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26