## Cookies
Cookie 是用戶訪問網站時瀏覽器上存儲的小型文本文件,由服務器發送而來。每當用戶加載網站時,瀏覽器都會將 cookie 發送回服務器以通知用戶之前的活動。
Cookie 作為一個可靠驗證憑據,可用來記錄狀態信息(比如在線商城購物車中的商品)或記錄用戶的瀏覽器活動(包括單擊特定按鈕,登錄或記錄訪問過的頁面)。Cookie 還可以存儲用戶先前輸入的密碼和表單內容,例如信用卡號或地址。
### Cookie 屬性
| 屬性 | 可選 |
| :------- | :--- |
| Name | No |
| Value | No |
| Path | Yes |
| Domain | Yes |
| Expires | Yes |
| Secure | Yes |
| HTTPOnly | Yes |
Echo 使用 golang 自帶的 `http.Cookie` 對象寫入/讀取從上下文中的 cookie。
### 創建一個 Cookie
```go
func writeCookie(c echo.Context) error {
cookie := new(http.Cookie)
cookie.Name = "username"
cookie.Value = "jon"
cookie.Expires = time.Now().Add(24 * time.Hour)
c.SetCookie(cookie)
return c.String(http.StatusOK, "write a cookie")
}
```
- 使用 `new(http.Cookie)` 創建Cookie。
- cookie 的屬性值會被賦值給 `http.Cookie` 的可導出屬性。
- 最后,使用 `c.SetCookie(cookies)` 來給 HTTP 響應增加 `Set-Cookie` 頭。
### 讀取 Cookie
```go
func readCookie(c echo.Context) error {
cookie, err := c.Cookie("username")
if err != nil {
return err
}
fmt.Println(cookie.Name)
fmt.Println(cookie.Value)
return c.String(http.StatusOK, "read a cookie")
}
```
- Cookie 通過名稱從 HTTP 請求里讀取:`c.Cookie("name")`。
- Cookie 的屬性可以使用 `Getter` 方法獲取。
### 讀取所有 Cookies
```go
func readAllCookies(c echo.Context) error {
for _, cookie := range c.Cookies() {
fmt.Println(cookie.Name)
fmt.Println(cookie.Value)
}
return c.String(http.StatusOK, "read all cookie")
}
```