最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言讀取,設置Cookie及設置cookie過期方法詳解

 更新時間:2022年04月18日 10:25:04   作者:駿馬金龍  
這篇文章主要介紹了Go語言讀取,設置Cookie及設置cookie過期方法詳解,需要的朋友可以參考下

Cookie用來解決http協(xié)議無狀態(tài)的問題。

首先,在服務端生成Cookie,然后在http響應header中設置Set-Cookie字段,客戶端會讀取到Set-Cookie字段后,會將cookie信息存儲起來,下次繼續(xù)訪問服務端時,會在http請求中設置Cookie字段并發(fā)送給服務端,服務端可以解析這個Cookie字段,從而知道這個客戶端之前已經(jīng)和自己有過會話(上下文),然后再執(zhí)行相應的邏輯代碼。

Cookie分為兩種類型:session cookie和persistent cookie。

  • Session Cookie也稱為臨時Cookie,客戶端只會將cookie數(shù)據(jù)存儲在http client進程的內(nèi)容中,不會保存到磁盤文件中(或其它存儲設備),瀏覽器關(guān)閉(或者說http client進程退出)的時候,cookie就刪除了。
  • persistent cookie是持久化cookie,瀏覽器退出也不刪除,而是根據(jù)服務端發(fā)送cookie時設置的過期時長判斷cookie是否過期,只要cookie還有效,客戶端就會攜帶cookie訪問服務端。

Cookie struct

$ go doc http.cookie

type Cookie struct {
        Name  string
        Value string

        Path       string    // optional
        Domain     string    // optional
        Expires    time.Time // optional
        RawExpires string    // for reading cookies only

        // MaxAge=0 means no 'Max-Age' attribute specified.
        // MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
        // MaxAge>0 means Max-Age attribute present and given in seconds
        MaxAge   int
        Secure   bool
        HttpOnly bool
        Raw      string
        Unparsed []string // Raw text of unparsed attribute-value pairs
}


func (c *Cookie) String() string

一個Cookie代表一個http cookie。服務端可以設置多個Set-Cookie字段發(fā)送給客戶端。。

Name和Value分別設置這個cookie的key/value。一定要有至少一個能唯一區(qū)分客戶端的ID類的value。

Expires指定cookie到什么時候過期,是一個時間值。當指定為過去的時間值時,表示這個cookie已經(jīng)過期。

MaxAge也用來設置cookie什么時候過期,MaxAge為負數(shù)或等于0表示立即過期,MaxAge大于0表示過多少秒之后過期。

MaxAge和Expires都可以設置cookie持久化時的過期時長,Expires是老式的過期方法,如果可以,應該使用MaxAge設置過期時間,但有些老版本的瀏覽器不支持MaxAge。如果要支持所有瀏覽器,要么使用Expires,要么同時使用MaxAge和Expires。

Path和Domain設置訪問哪些路徑或域名范圍的主機時應該攜帶這個cookie。如果不設置,則訪問所有路徑、該Domain下的主機都攜帶cookie。

cookie.Path("/WEB16");
    代表訪問WEB16應用中的任何資源都攜帶cookie
cookie.Path("/WEB16/cookietest");
    代表訪問WEB16中的cookietest時才攜帶cookie信息
cookie.Domain(".foo.com");
    這對foo.com域下的所有主機都生效(如www.foo.com),但不包括子域www.abc.foo.com

Secure和HttpOnly字段為cookie提供一些保護機制。這兩個cookie屬性的介紹,參見:

Cookie有一個String()方法,用來將Cookie實例轉(zhuǎn)換成字符串。轉(zhuǎn)化成字符串之后就可以直接設置在Header中。

例如,下面是登錄youtube的時候,對方發(fā)送給我的cookie:

設置Cookie并發(fā)送給客戶端

package main

import (
	"fmt"
	"net/http"
)

func setCookie(w http.ResponseWriter, r *http.Request) {
	// 定義兩個cookie
	c1 := http.Cookie{
		Name:  "first_cookie",
		Value: "Go Programming",
	}
	c2 := http.Cookie{
		Name:     "second_cookie",
		Value:    "Go Web Programming",
		HttpOnly: true,
	}
	// 設置Set-Cookie字段
	w.Header().Set("Set-Cookie", c1.String())
	w.Header().Add("Set-Cookie", c2.String())
	fmt.Fprintf(w, "%s\n%s\n", c1.String(), c2.String())
}

func main() {
	server := http.Server{
		Addr: "127.0.0.1:8080",
	}
	http.HandleFunc("/set_cookie", setCookie)
	server.ListenAndServe()
}

訪問http://127.0.0.1:8080/set_cookie時,查看Header將顯式Set-Cookie字段。

$ curl -i http://127.0.0.1:8080/set_cookie
HTTP/1.1 200 OK
Set-Cookie: first_cookie="Go Programming"
Set-Cookie: second_cookie="Go Web Programming"; HttpOnly
Date: Tue, 27 Nov 2018 10:12:44 GMT
Content-Length: 75
Content-Type: text/plain; charset=utf-8

first_cookie="Go Programming"
second_cookie="Go Web Programming"; HttpOnly

http包提供了一個SetCookie()函數(shù),可以直接用來設置Set-Cookie字段。

func SetCookie(w ResponseWriter, cookie *Cookie)

注意,第二個字段是指針類型的Cookie。

修改前面的示例,使用SetCookie()函數(shù)發(fā)送Set-Cookie字段:

func setCookie(w http.ResponseWriter, r *http.Request) {
	c1 := http.Cookie{
		Name:  "first_cookie",
		Value: "Go Programming",
	}
	c2 := http.Cookie{
		Name:     "second_cookie",
		Value:    "Go Web Programming",
		HttpOnly: true,
	}
	http.SetCookie(w, &c1)
	http.SetCookie(w, &c2)
}

取得客戶端攜帶的cookie

由于客戶端發(fā)起請求時,如果攜帶cookie,是直接放在Request的Cookie Header中的。所以,可以通過Request取得客戶端攜帶的cookie信息。當然,也可以通過Request的方法Cookie()或Cookies()取得cookie信息。

func (r *Request) Cookie(name string) (*Cookie, error)
func (r *Request) Cookies() []*Cookie
  • Cookie(Name)只取某個cookie
  • Cookies()取所有的cookie

下面是通過Request Header的方式取Cookie的示例:

package main

import (
	"fmt"
	"net/http"
)

func setCookie(w http.ResponseWriter, r *http.Request) {
	c1 := http.Cookie{
		Name:  "first_cookie",
		Value: "Go Programming",
	}
	c2 := http.Cookie{
		Name:     "second_cookie",
		Value:    "Go Web Programming",
		HttpOnly: true,
	}
	http.SetCookie(w, &c1)
	http.SetCookie(w, &c2)
}

func getCookie(w http.ResponseWriter, r *http.Request) {
	cookie := r.Header.Get("Cookie")
	fmt.Fprintf(w, "%s\n", cookie)
}

func main() {
	server := http.Server{
		Addr: "127.0.0.1:8080",
	}
	http.HandleFunc("/set_cookie", setCookie)
	http.HandleFunc("/get_cookie", getCookie)
	server.ListenAndServe()
}

在訪問http://127.0.0.1:8080/set_cookie之后不要關(guān)閉瀏覽器,再次訪問http://127.0.0.1:8080/get_cookie,將輸出:

first_cookie="Go Programming"; second_cookie="Go Web Programming"

或者,使用curl記錄cookie,并下次訪問時讀取cookie:

$ curl -c a.cookie http://127.0.0.1:8080/set_cookie
$ curl -b a.cookie http://127.0.0.1:8080/get_cookie
first_cookie="Go Programming"; second_cookie="Go Web Programming"

下面是改用Request的Cookie()和Cookies()方法取cookie:

func getCookie(w http.ResponseWriter, r *http.Request) {
	cookie, err := r.Cookie("first_cookie")
	if err != nil {
		fmt.Fprintf(w, "Cat't get Cookie")
	}
	cookies := r.Cookies()
	fmt.Fprintf(w, "%s\n%s\n", cookie, cookies)
}

訪問結(jié)果:

$ curl -c a.cookie http://127.0.0.1:8080/set_cookie
$ curl -b a.cookie http://127.0.0.1:8080/get_cookie
first_cookie="Go Programming"
[first_cookie="Go Programming" second_cookie="Go Web Programming"]

設置cookie過期示例:發(fā)送臨時消息

有時候可能想要讓客戶端的某些操作只顯示一次相關(guān)消息,例如post一篇帖子失敗后,應該顯示失敗信息,但下次再訪問不應該再顯示這些失敗信息。

通過設置cookie過期的技巧,可以實現(xiàn)一些一次性操作。設置cookie過期的方式是設置MaxAge為負數(shù)或0,為了兼容所有瀏覽器,可以設置Expires為過去的一段時間。

下面的示例中,將一段數(shù)據(jù)使用URL格式編碼后作為flash cookie的值。當客戶端訪問set_message的時候,就會在http Client進程中保存這段cookie。再訪問show_message的時候,handler解析客戶端攜帶的cookie,并設置一個Set-Cookie字段,這個字段的作用是使之前保存的cookie過期。然后輸出解碼后客戶端攜帶的cookie的值。再次刷新show_message,將得到不同的輸出結(jié)果。

package main

import (
	"encoding/base64"
	"fmt"
	"net/http"
	"time"
)

func set_message(w http.ResponseWriter, r *http.Request) {
	msg := []byte("Hello World")
	cookie := http.Cookie{
		Name:  "flash",
		Value: base64.URLEncoding.EncodeToString(msg),
	}
	http.SetCookie(w, &cookie)
}

func show_message(w http.ResponseWriter, r *http.Request) {
	cookie, err := r.Cookie("flash")
	if err != nil {
		if err == http.ErrNoCookie {
			fmt.Fprintln(w, "no messages to show")
		}
	} else {
		expire_cookie := http.Cookie{
			Name:    "flash",
			MaxAge:  -1,
			Expires: time.Unix(1, 0),
		}
		http.SetCookie(w, &expire_cookie)
		value, _ := base64.URLEncoding.DecodeString(cookie.Value)
		fmt.Fprintln(w, string(value))
	}
}
func main() {
	server := http.Server{
		Addr: "127.0.0.1:8080",
	}
	http.HandleFunc("/set_message", set_message)
	http.HandleFunc("/show_message", show_message)
	server.ListenAndServe()
}

使用curl測試。注意,首先訪問set_message的時候,保存cookie到b.cookie文件。再訪問show_message的時候,也要帶上-c b.cookie將已保存的cookie設置為過期,之后再訪問show_message就會出現(xiàn)預期的結(jié)果:

$ curl -c b.cookie http://127.0.0.1:8080/set_message
$ curl -b b.cookie -c b.cookie http://127.0.0.1:8080/show_message
Hello World

$ curl -b b.cookie -c b.cookie http://127.0.0.1:8080/show_message
no messages to show

 

相關(guān)文章

  • 詳解Golang中的通道機制與應用

    詳解Golang中的通道機制與應用

    這篇文章主要來和大家一起深入探討了Go語言中通道(Channel)的各個方面,文章詳細解析了通道的類型、操作方法以及垃圾回收機制,有需要的可以了解下
    2023-10-10
  • golang如何利用原始套接字構(gòu)造UDP包詳解

    golang如何利用原始套接字構(gòu)造UDP包詳解

    這篇文章主要給大家介紹了關(guān)于golang如何利用原始套接字構(gòu)造UDP包的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用golang具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-10-10
  • 用Go獲取短信驗證碼的示例代碼

    用Go獲取短信驗證碼的示例代碼

    要用Go獲取短信驗證碼,通常需要連接到一個短信服務提供商的API,并通過該API發(fā)送請求來獲取驗證碼,由于不同的短信服務提供商可能具有不同的API和授權(quán)方式,我將以一個簡單的示例介紹如何使用Go語言來獲取短信驗證碼,需要的朋友可以參考下
    2023-07-07
  • 詳解使用Go添加Nginx代理的方法示例

    詳解使用Go添加Nginx代理的方法示例

    這篇文章主要介紹了詳解使用Go添加Nginx代理的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 深入理解Go中defer的機制

    深入理解Go中defer的機制

    本文主要介紹了Go中defer的機制,包括執(zhí)行順序、參數(shù)預計算、閉包和與返回值的交互,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn)

    GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn)

    本文主要介紹了GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • golang 各種排序大比拼實例

    golang 各種排序大比拼實例

    這篇文章主要介紹了golang 各種排序大比拼實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言字符串常見操作的使用匯總

    Go語言字符串常見操作的使用匯總

    這篇文章主要為大家總結(jié)了Go語言中常見的幾種字符串操作,例如:位置索引、替換、統(tǒng)計次數(shù)等,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-04-04
  • Go語言編程中字符串切割方法小結(jié)

    Go語言編程中字符串切割方法小結(jié)

    這篇文章主要介紹了Go語言編程中字符串切割方法小結(jié),所整理的方法都來自字符串相關(guān)的strings包,需要的朋友可以參考下
    2015-10-10
  • Go中strings包的基本使用示例代碼

    Go中strings包的基本使用示例代碼

    本文詳細介紹了Go語言中strings包的基本使用方法,包括字符串的前綴、后綴判斷,字符串包含、索引查找、字符串替換、計數(shù)、重復、大小寫轉(zhuǎn)換、修剪、分割、拼接以及數(shù)據(jù)類型轉(zhuǎn)換等功能,示例代碼豐富,適合初學者和需要使用字符串處理功能的開發(fā)者參考學習
    2024-10-10

最新評論

垫江县| 喀喇| 十堰市| 马公市| 呈贡县| 晋宁县| 玉门市| 浠水县| 浦江县| 兰州市| 大宁县| 汨罗市| 乌鲁木齐市| 霍山县| 平湖市| 泗洪县| 洛宁县| 奉新县| 静乐县| 连山| 无极县| 射洪县| 嵊泗县| 南澳县| 鸡东县| 阿拉尔市| 兴隆县| 曲周县| 宁海县| 垦利县| 长汀县| 中江县| 鹤庆县| 广东省| 莱芜市| 炉霍县| 白朗县| 陇川县| 高台县| 滦平县| 香格里拉县|