@kexinWeb
2017-03-06T20:24:34.000000Z
字数 3485
阅读 2300
cookie
session
- HTTP是一种无状态的协议,也就是,当客户端发出请求的时候,无法得知上一次请求的状态。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。所以产生了cookie和session这两门技术来解决这一问题。
- 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
每次请求浏览器都会将cookie发给服务器
在浏览器地址栏输入javascript:alert (document. cookie)就可以了(需要有网才能查看)。JavaScript脚本会弹出一个对话框显示本网站颁发的所有Cookie的内容
如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。
除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
cookie 虽然很方便,但是使用 cookie 有一个很大的弊端,cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 cookie 中了,而且如果 cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 session,session 中的数据是保留在服务器端的。
在express框架中使用cookie需要加载另外一个模块: cookie-parser(https://github.com/expressjs/cookie-parser)
$ npm install cookie-parser
使用cookie-parser比较简单
app.use(cookieParser())
var express = require('express')
var cookieParser = require('cookie-parser')
var app = express()
app.use(cookieParser())
req.cookie
就可以访问浏览器携带的cookie了,其中req.signedCookies
是访问的是加密模式下的cookie。
var express = require('express')
var cookieParser = require('cookie-parser')
var app = express()
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)
npm install express-session
req/res
对象读写cookie了。
- cookie: 默认值为 { path: '/', httpOnly: true, secure: false, maxAge: null }
- genid: 调用函数返回新的session ID,函数的返回值就是新生成的session ID
- name: session ID cookie的名称, 最好每个应用程序的name设置不一样
- secret: 必需选项,用于加密
用于获取相关session配置,用req.session对象可以访问相关的session数据。
重新生成session会话
注销会话
//加载express模块
var express = require('express')
//加载url解析模块
var parseurl = require('parseurl')
//加载express-session模块
var session = require('express-session')
//创建一个express应用程序app
var app = express()
//配置session选项
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}))
app.use(function (req, res, next) {
var views = req.session.views
if (!views) {
views = req.session.views = {}
}
// get the url pathname
var pathname = parseurl(req).pathname
// count the views
views[pathname] = (views[pathname] || 0) + 1
next()
})
app.get('/foo', function (req, res, next) {
res.send('you viewed this page ' + req.session.views['/foo'] + ' times')
})
app.get('/bar', function (req, res, next) {
res.send('you viewed this page ' + req.session.views['/bar'] + ' times')
})
https://github.com/expressjs/session
https://github.com/expressjs/cookie-parser