@kexinWeb
        
        2017-03-06T12:24:34.000000Z
        字数 3485
        阅读 2484
    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 signedconsole.log('Cookies: ', req.cookies)// Cookies that have been signedconsole.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应用程序appvar app = express()//配置session选项app.use(session({secret: 'keyboard cat',resave: false,saveUninitialized: true}))app.use(function (req, res, next) {var views = req.session.viewsif (!views) {views = req.session.views = {}}// get the url pathnamevar pathname = parseurl(req).pathname// count the viewsviews[pathname] = (views[pathname] || 0) + 1next()})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