一皆撩、關(guān)于Cookie
在我們關(guān)閉一個登錄過的網(wǎng)址并重新打開它后鹊奖,我們的登錄信息并沒有丟失拓轻;在我們?yōu)g覽了商品后歷史記錄里出現(xiàn)了我們?yōu)g覽過的商品邓深;在我們返回到網(wǎng)站首頁后如输,系統(tǒng)已為我們推薦了相似的商品偏序;這些是如何做到的呢卦溢?對佳鳖,通過Cookie。世界上沒有黑魔法也殖,程序里面也沒有黑魔法土思,事實(shí)上只要我們在瀏覽器中進(jìn)行過某類操作后务热,瀏覽器會將我們的操作信息保存到cookie中忆嗜。簡而言之,cookie就是儲存在用戶本地終端(瀏覽器)上的數(shù)據(jù)崎岂。
Cookie的特點(diǎn)
- cookie保存在瀏覽器本地捆毫,只要不過期關(guān)閉瀏覽器也不會消失。
- 正常情況下cookie不加密冲甘,用戶可輕松看到
- 用戶可以刪除或者禁用cookie
- cookie可以被篡改
- cookie可用于攻擊
- cookie存儲量很小绩卤,正常情況下最大容量限制是4k
- 發(fā)送請求自動帶上會自動攜帶Cookie中的信息(基于http協(xié)議約定的)
二、Cookie的安裝及使用
1.安裝
如果使用express腳手架創(chuàng)建項(xiàng)目,項(xiàng)目中默認(rèn)已經(jīng)包含了cookie組件江醇,如果沒有,可以使用命令安裝
cnpm install cookie-parser --save
2.使用cookie
將cookie作為中間件使用
var cookieParser = require('cookie-parser');
app.use(cookieParser());
3.設(shè)置cookie
語法:res.cookie(name,value[,options])
app.get('/login',(req,res,next)=>{
//登錄成功后濒憋,在cookie中添加isLogin,過期時間為30分鐘
res.cookie('isLogin','true',{maxAge:30*60*1000})
})
關(guān)于設(shè)置cookie的參數(shù)(options)說明:
- domain: 域名
- name=value:鍵值對陶夜,可以設(shè)置要保存的 Key/Value凛驮,注意這里的 name 不能和其他屬性項(xiàng)的名字一樣
- Expires: 過期時間(秒),在設(shè)置的某個時間點(diǎn)后該 Cookie 就會失效条辟,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT黔夭。
- maxAge: 最大失效時間(毫秒)宏胯,設(shè)置在多少后失效 。
- secure: 當(dāng) secure 值為 true 時本姥,cookie 在 HTTP 中是無效肩袍,在 HTTPS 中才有效 。
- Path: 表示 在那個路由下可以訪問到cookie婚惫。
- httpOnly:是微軟對 COOKIE 做的擴(kuò)展氛赐。如果在 COOKIE 中設(shè)置了“httpOnly”屬性,則通過程序(JS 腳本先舷、applet 等)將無法讀取到COOKIE 信息鹰祸,防止 XSS 攻擊的產(chǎn)生 。
- singed:表示是否簽名cookie, 設(shè)為true 會對這個 cookie 簽名密浑,這樣就需要用 res.signedCookies 而不是 res.cookies 訪問它蛙婴。被篡改的簽名 cookie 會被服務(wù)器拒絕,并且 cookie 值會重置為它的原始值尔破。
4.獲取cookie
app.get('/isLogin',(req,res,next)=>{
let isLogin = req.cookies.isLogin;
console.log(isLogin)
res.send("isLogin:" + isLogin)
})
5.基礎(chǔ)實(shí)例完整代碼
當(dāng)訪問/login路由后會在cookie中設(shè)置isLogin=true街图,當(dāng)訪問/isLogin路由后會獲取到設(shè)置的isLogin值。在其他標(biāo)簽頁面繼續(xù)獲取訪問/isLogin也可以獲取cookie
var express = require('express');
var app = express();
//引入cookie
var cookieParser = require('cookie-parser')
//以中間件的形式使用cookie
app.use(cookieParser())
app.get('/login',(req,res,next)=>{
//設(shè)置cookie懒构, 過期時間為30分鐘
res.cookie('isLogin','true',{maxAge:30*60*1000})
})
app.get('/isLogin',(req,res,next)=>{
//獲取cookie
let isLogin = req.cookies.isLogin;
console.log(isLogin)
res.send("isLogin:" + (isLogin ? true : false))
})
module.exports = app;
三餐济、多個二級域名共享cookie
只需修改res.cookie中option對象的配置,即可實(shí)現(xiàn)多個二級域名的cookie共享
res.cookie('token',token,{maxAge:30*60*1000,domain:'giteasy.cn'})
//關(guān)鍵配置domain:'giteasy.cn'
測試
1. 配置hosts文件
# 測試環(huán)境
127.0.0.1 aaa.giteasy.cn
127.0.0.1 bbb.giteasy.cn
2.app.js
var express = require('express');
var app = express();
var cookieParser = require('cookie-parser')
app.use(cookieParser())
app.get('/set',(req,res,next)=>{
let token = '318514ae-83b9-47ab-947a-86f828b391e9';
res.cookie('token',token,{maxAge:30*60*1000,domain:'giteasy.cn'})
res.send('success')
})
app.get('/get',(req,res,next)=>{
let token = req.cookies.token;
console.log(token)
res.send("token:" + (token || 'null'))
})
module.exports = app;
可以看到胆剧,不同的二級域名也能訪問到相同的cookie絮姆,只要滿足giteasy.cn這個頂級域名就行。