浏览器和Webserver之间的关联,被设想为无状况的,这是一个很主要的设想,能够让客户端无需和效劳器坚持状况,节约珍贵的端口资本,从而能够为更多的客户链接效劳。
然则如许带来了题目,简言之,效劳器没法晓得两个要求是不是来自于同一个浏览器。但是,在页面接见计数,购物车等运用中,效劳器是须要辨别差别的浏览器的,比方客户浏览器1安排到购物车内的商品,和客户2浏览器的不能够混淆在一起。
要领是有的。比方在要求的页面中插进去一个 token,然后在下次要求时将这个 token 返回至效劳器。能够把token放到form内或许URL参数内。
然则被广为接收的是Cookie要领。cookie就是依据效劳器相应头的指导,浏览器保留的一段文本。并在随后的要求中将这些信息发送至Web效劳器,Web效劳器就能够运用这些信息来辨认差别的用户。
具体做法就是:
- 效劳器能够为来访的浏览器设置一个值,这个经由过程response内的Set-Cookie来完成
- 浏览器记着这个值,而且每次接见效劳器时,发送此值过来。能够从request内的Cookie值承载
演示
以下代码运用express.js,演示了一个接见计数的效劳:
const express = require('express')
const app = express()
app.get('/', (req, res) => {
var count = req.header("Cookie")
if (!count){
count = 0
}
count = parseInt(count) + 1
res.setHeader("Set-Cookie",count)
res.send('Your Visit page count:' + count)
})
app.get('/reset', (req, res) => {
res.setHeader("Set-Cookie",0)
res.send('Your Visit page count:' + 0)
})
app.listen(3000, () => console.log('Example app listening on port 3000!'))
能够翻开浏览器,比方chrome,接见localhost:3000,每次革新,能够看到:
Your Visit page count:0
的数字加1。
能够再翻开别的一个和chrome差别的浏览器,比方safari,接见localhost:3000,每次革新,能够看到:
Your Visit page count:0
的数字加1。这两个加1的行动,两个浏览器各自加各自的,相互并不影响。
建立 cookie
经由过程发送一个称为Set-Cookie的HTTP 音讯头来建立一个 cookie,花样以下:
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
音讯头的第一部份,value 部份,能够是恣意字符串。然则通常是一个name=value花样的字符串。
可选项部份只会在浏览器端运用,而不会被发送至效劳器端。包括逾期时候选项,
逾期时候选项
逾期时候(expires),指定了 cookie 什么时候不会再被发送至效劳器,随后浏览器将删除该 cookie。该选项的值是一个 Wdy, DD-Mon-YYYY HH:MM:SS GMT 日期花样的值
expires=Sat, 02 May 2009 23:38:25 GMT
假如 expires 设置了一个过去的时候点,那末这个 cookie 会被马上删掉。没有设置 expires 选项时,cookie 的生命周期仅限于当前会话中,封闭浏览器意味着此次会话的完毕,
domain 选项
指定了 cookie 将要被发送至哪一个或哪些域中。默许情况下,domain 会被设置为建立该 cookie 的页面地点的域名,所以当给雷同域名发送要求时该 cookie 会被发送至效劳器。比方,本博中 cookie 的默许值将是 bubkoo.com。domain 选项可用来扩大 cookie 可发送域的数目,Yahoo! 这类大型网站,都邑有很多 *.yahoo.com 情势的站点(比方:my.yahoo.com, finance.yahoo.com 等等)。将一个 cookie 的 domain 选项设置为 yahoo.com,就能够将该 cookie 的值发送至所有这些站点。
path 选项
另一个掌握 Cookie 音讯头发送机遇的选项是 path 选项,和 domain 选项相似,path 选项指定了要求的资本 URL 中必需存在指定的途径时,才会发送Cookie 音讯头。这个比较通常是将 path 选项的值与要求的 URL 从头开始逐字符比较完成的。假如字符婚配,则发送 Cookie 音讯头:
path=/blog
在这个例子中,path 选项值会与 /blog,/blogrool 等等相婚配;任何故 /blog 开首的选项都是正当的。
secure 选项
只有当一个要求经由过程 SSL 或 HTTPS 建立时,包括 secure 选项的 cookie 才被发送至效劳器。比方:
Set-Cookie: value; secure