[TOC]
## cookie的種植
瀏覽器自己并不能決定是否設置cookie(當然你可以通過調試器手動往里添加cookie),在它第一次訪問服務器的時候,服務器如果有需要會向瀏覽器傳達**種植**cookie的命令,這樣在它第二次訪問服務器的相同地址時會帶上這個種植的cookie
## cookie的設置
### 設置單個cookie
```
res.setHeader('Set-Cookie','name=ahhh; Path=/read; Max-Age=30; Expires=Fri, 16 Mar 2018 16:15:22 GMT; HttpOnly; Secure');
```
可以發現**一個**cookie內部是使用 `;空格 ` 來分隔cookie-param的
服務器設置了cookie以后,在響應頭中會多一個`Set-Cookie`字段
```
//res中
Set-Cookie: name=ahhh; Path=/read; Max-Age=30; Expires=Fri, 16 Mar 2018 16:15:22 GMT; HttpOnly; Secure
```
### cookie參數
cookie參數主要是針對 `作用域`、`有效時間` 兩個方面。只有在規定的范圍內,cookie才會顯示、生效。
作用域的修飾包括 :
- `Domain` : 訪問的域名必須是Domain規定的域名
- `Path` : 必須是以規定的Path的**開頭的**(比如/read,/read/1,/read/1/2)路徑才能訪問該cookie
- `HttpOnly` : 只有通過 http請求才能查看到cookie,**不再能**通過瀏覽器控制臺查看,這意味著瀏覽器端不再能手動更改服務器所種植的cookie(但我們仍然能通過curl等其它方式作為客戶端傳遞'虛假'cookie)
- `Secure`:必須是https協議才能查看
有效時間的修飾包括
- `Max-Age`:相對時間,單位為S,express中設置時單位為毫秒

- `Exipres`:絕對時間,且為UTC格式,express中設置時單位為毫秒
Max-Age和Expires的區別在于,Max-Age的值是相對時間,也就是說你只需要設置存貨多久(howlong),而Expires要先獲取當前時間(Date.now()),在這個時間的基礎之上再加上存貨時間
雖然設置不一樣,但最終它們呈現在瀏覽器application中都是一樣的,以一種日期格式顯現(而不是時間戳)

### 設置多個cookie
node中允許我們通過數組的形式設置多個cookie
```
req.setHeader('Set-Cookie',[cookie1,cookie2...])
```
cookie之間有逗號隔開,每個cookie中的參數用`;空格`隔開
注意,不要妄圖想通過設置多次Set-Cookie來達到設置多個cookie的目的,因為前面的是會被后面的覆蓋的
但,話又說回來,實際上在響應報文里,多個cookie的設置的確是通過設置多個Set-Cookie字段來實現的
```
Set-Cookie: ahhh=111; Path=/read; Max-Age=10; HttpOnly; Expires=Fri, 16 Mar 2018 16:29:56 GMT
Set-Cookie: age=123
```
嗯,注意區分,雖然最底層是通過設置多個Set-Cookie字段實現多個cookie的設置,但Node.JS提供給我們的API卻不是這樣的,我們需要在一次setHeader Set-Cookie的設置里,通過傳遞一個數組的形式來設置多個cookie。
## cookie的獲取
```
req.headers['cookie']
```
cookie獲取時**不會**顯示cookie的參數設置,另外如果有多個cookie,它們之間是用 `;空格` 隔開的
```
ahhh=111; age=123
```
## cookie失效情景
- 指定了path,只會在指定path下才看得到cookie,**甚至是在瀏覽器的cookie查看器中也是!**
- 請留意是否開啟了`Secure`,開啟的話只能在https下訪問到該cookie
## 關于中文字符
設置cookie是不能直接放中文的,會報錯

固需要使用`encodeURIComponent`進行編碼,
再獲取這種帶中文字符編碼的cookie時也需要`decodeURIComponent`進行解碼
## Express中的cookie設置
```
res.cookie('name','ahhh',{expires:new Date(Date.now()+10*1000)});
res.cookie('name','ahhh',{maxAge:10*1000});
```
```
req.headers.cookie; //name=ahhh;[空格]age=11
```
### cookie-parser
將headers里的cookie掛在了req上
并且解析成了對象
注意express獲取cookie,是用`req.cookies`(**s**),有s!!(而原生的是沒有s)
```
app.use(cookieParser());
console.log(req.cookies);
<<<輸出
{
name:ahhh
,age:11
}
```
### express中的cookie參數
統一都是小駝峰命名
### 支持設置帶中文的cookie
express會自動進行編碼
