Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Express教程06:Session(完结) #73

Open
chencl1986 opened this issue Jun 1, 2019 · 0 comments
Open

Express教程06:Session(完结) #73

chencl1986 opened this issue Jun 1, 2019 · 0 comments

Comments

@chencl1986
Copy link
Owner

阅读更多系列文章请访问我的GitHub博客,示例代码请访问这里

Session介绍

Session存储在服务器,但它并不独立使用,而是与Cookie或配合使用。

也就是说,在Cookie中存储了一个ID,服务端在接收到Cookie时对ID进行校验,只有通过校验才可以进行下一步处理,否则将让用户重新登录。

Session相对单纯的Cookie校验而言比较安全,但也有可能发生Session劫持。

使用cookie-session中间件操作Session

cookie-session介绍

cookie-session是常用来处理Session的中间件。为了保证安全性,它是强制加密的。

安装cookie-session

npm install cookie-session

使用cookie-session

示例代码:/lesson06/server.js

同其他中间件类似,cookie-session也只需要server.use方法调用,并传入配置即可:

server.use(cookieSession({
  // 循环密钥,其中有若干个密钥。如果只有一个密钥,容易被客户端破解,多个密钥相对安全
  keys: [
    'tVnVq4zDhDtQPGPrx2qSOSdmuYI24C',
    'IUTEaA1wKoWnVDf4DspSBAjKvLWcyn',
    'yC7cWHZDYoRMYawxSVDdzKQdXkZ9sE',
    'Ikjk6OibzaBYiEM13Mrj8ITdb3DonG',
    'uyajLZWgim4BS4SuQtH4kbTi640mWo',
  ],
  // 设置20分钟有效期,若Session丢失,过期后将无法再被使用
  maxAge: 20 * 60 * 1000
}))

使用中间件后,在接口中对Session进行操作:

// 在接口中操作Session
server.get('/session', (req, res, next) => {
  console.log(`Session: ${JSON.stringify(req.session)}`)

  // 每次访问/session接口,就将Session中的number值加1
  if (req.session.number) {
    req.session.number++
  } else {
    req.session.number = 1
  }

  // 存储用户ID
  req.session.id = 'lee'

  res.send(`Session: ${JSON.stringify(req.session)}`)
})

在浏览器中访问http://localhost:8080/session,就可以看到在页面上打印出的Session值,如Session: {"number":1,"id":"lee"}

在浏览器的控制台中可以看到保存在Cookie中的Session值:

express:sess: eyJudW1iZXIiOjEsImlkIjoibGVlIn0=  // Session的值
express:sess.sig: 2wiwgJGBFBrNF4HuNSECtE39i8w // 对Session值的签名,用来保护Session不被篡改

我们可以尝试在控制台中直接修改express:sessexpress:sess.sig的值,刷新后Session会因为校验不通过而被重置。

服务端存储Session

通常在项目开发中,也需要将Session保存在服务端,便于进行校验。

此时可以使用JavaScript库如express-mysql-session,将Session保存在MySQL数据库中。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant