国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

Go session和cookie

2022-05-13 17:46 更新

session和cookie是網(wǎng)站瀏覽中較為常見(jiàn)的兩個(gè)概念,也是比較難以辨析的兩個(gè)概念,但它們?cè)跒g覽需要認(rèn)證的服務(wù)頁(yè)面以及頁(yè)面統(tǒng)計(jì)中卻相當(dāng)關(guān)鍵。我們先來(lái)了解一下session和cookie怎么來(lái)的?考慮這樣一個(gè)問(wèn)題:

如何抓取一個(gè)訪問(wèn)受限的網(wǎng)頁(yè)?如新浪微博好友的主頁(yè),個(gè)人微博頁(yè)面等。

顯然,通過(guò)瀏覽器,我們可以手動(dòng)輸入用戶名和密碼來(lái)訪問(wèn)頁(yè)面,而所謂的“抓取”,其實(shí)就是使用程序來(lái)模擬完成同樣的工作,因此我們需要了解“登陸”過(guò)程中到底發(fā)生了什么。

當(dāng)用戶來(lái)到微博登陸頁(yè)面,輸入用戶名和密碼之后點(diǎn)擊“登錄”后瀏覽器將認(rèn)證信息POST給遠(yuǎn)端的服務(wù)器,服務(wù)器執(zhí)行驗(yàn)證邏輯,如果驗(yàn)證通過(guò),則瀏覽器會(huì)跳轉(zhuǎn)到登錄用戶的微博首頁(yè),在登錄成功后,服務(wù)器如何驗(yàn)證我們對(duì)其他受限制頁(yè)面的訪問(wèn)呢?因?yàn)镠TTP協(xié)議是無(wú)狀態(tài)的,所以很顯然服務(wù)器不可能知道我們已經(jīng)在上一次的HTTP請(qǐng)求中通過(guò)了驗(yàn)證。當(dāng)然,最簡(jiǎn)單的解決方案就是所有的請(qǐng)求里面都帶上用戶名和密碼,這樣雖然可行,但大大加重了服務(wù)器的負(fù)擔(dān)(對(duì)于每個(gè)request都需要到數(shù)據(jù)庫(kù)驗(yàn)證),也大大降低了用戶體驗(yàn)(每個(gè)頁(yè)面都需要重新輸入用戶名密碼,每個(gè)頁(yè)面都帶有登錄表單)。既然直接在請(qǐng)求中帶上用戶名與密碼不可行,那么就只有在服務(wù)器或客戶端保存一些類似的可以代表身份的信息了,所以就有了cookie與session。

cookie,簡(jiǎn)而言之就是在本地計(jì)算機(jī)保存一些用戶操作的歷史信息(當(dāng)然包括登錄信息),并在用戶再次訪問(wèn)該站點(diǎn)時(shí)瀏覽器通過(guò)HTTP協(xié)議將本地cookie內(nèi)容發(fā)送給服務(wù)器,從而完成驗(yàn)證,或繼續(xù)上一步操作。

session和cookie - 圖1

session,簡(jiǎn)而言之就是在服務(wù)器上保存用戶操作的歷史信息。服務(wù)器使用session id來(lái)標(biāo)識(shí)session,session id由服務(wù)器負(fù)責(zé)產(chǎn)生,保證隨機(jī)性與唯一性,相當(dāng)于一個(gè)隨機(jī)密鑰,避免在握手或傳輸中暴露用戶真實(shí)密碼。但該方式下,仍然需要將發(fā)送請(qǐng)求的客戶端與session進(jìn)行對(duì)應(yīng),所以可以借助cookie機(jī)制來(lái)獲取客戶端的標(biāo)識(shí)(即session id),也可以通過(guò)GET方式將id提交給服務(wù)器。

session和cookie - 圖2

Cookie是由瀏覽器維持的,存儲(chǔ)在客戶端的一小段文本信息,伴隨著用戶請(qǐng)求和頁(yè)面在Web服務(wù)器和瀏覽器之間傳遞。用戶每次訪問(wèn)站點(diǎn)時(shí),Web應(yīng)用程序都可以讀取cookie包含的信息。瀏覽器設(shè)置里面有cookie隱私數(shù)據(jù)選項(xiàng),打開(kāi)它,可以看到很多已訪問(wèn)網(wǎng)站的cookies,如下圖所示:

session和cookie - 圖3

cookie是有時(shí)間限制的,根據(jù)生命期不同分成兩種:會(huì)話cookie和持久cookie;

如果不設(shè)置過(guò)期時(shí)間,則表示這個(gè)cookie的生命周期為從創(chuàng)建到瀏覽器關(guān)閉為止,只要關(guān)閉瀏覽器窗口,cookie就消失了。這種生命期為瀏覽會(huì)話期的cookie被稱為會(huì)話cookie。會(huì)話cookie一般不保存在硬盤上而是保存在內(nèi)存里。

如果設(shè)置了過(guò)期時(shí)間(setMaxAge(606024)),瀏覽器就會(huì)把cookie保存到硬盤上,關(guān)閉后再次打開(kāi)瀏覽器,這些cookie依然有效直到超過(guò)設(shè)定的過(guò)期時(shí)間。存儲(chǔ)在硬盤上的cookie可以在不同的瀏覽器進(jìn)程間共享,比如兩個(gè)IE窗口。而對(duì)于保存在內(nèi)存的cookie,不同的瀏覽器有不同的處理方式。   

Go設(shè)置cookie

Go語(yǔ)言中通過(guò)net/http包中的SetCookie來(lái)設(shè)置:

http.SetCookie(w ResponseWriter, cookie *Cookie)

w表示需要寫入的response,cookie是一個(gè)struct,讓我們來(lái)看一下cookie對(duì)象是怎么樣的

type Cookie struct {
	Name       string
	Value      string
	Path       string
	Domain     string
	Expires    time.Time
	RawExpires string

// 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
}

我們來(lái)看一個(gè)例子,如何設(shè)置cookie

expiration := time.Now()
expiration = expiration.AddDate(1, 0, 0)
cookie := http.Cookie{Name: "username", Value: "astaxie", Expires: expiration}
http.SetCookie(w, &cookie)

Go讀取cookie

上面的例子演示了如何設(shè)置cookie數(shù)據(jù),我們這里來(lái)演示一下如何讀取cookie 

cookie, _ := r.Cookie("username")
fmt.Fprint(w, cookie)

還有另外一種讀取方式

for _, cookie := range r.Cookies() {
	fmt.Fprint(w, cookie.Name)
}

可以看到通過(guò)request獲取cookie非常方便。

session

session,中文經(jīng)常翻譯為會(huì)話,其本來(lái)的含義是指有始有終的一系列動(dòng)作/消息,比如打電話是從拿起電話撥號(hào)到掛斷電話這中間的一系列過(guò)程可以稱之為一個(gè)session。然而當(dāng)session一詞與網(wǎng)絡(luò)協(xié)議相關(guān)聯(lián)時(shí),它又往往隱含了“面向連接”和/或“保持狀態(tài)”這樣兩個(gè)含義。

session在Web開(kāi)發(fā)環(huán)境下的語(yǔ)義又有了新的擴(kuò)展,它的含義是指一類用來(lái)在客戶端與服務(wù)器端之間保持狀態(tài)的解決方案。有時(shí)候Session也用來(lái)指這種解決方案的存儲(chǔ)結(jié)構(gòu)。

session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。

但程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session的時(shí)候,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否包含了一個(gè)session標(biāo)識(shí)-稱為session id,如果已經(jīng)包含一個(gè)session id則說(shuō)明以前已經(jīng)為此客戶創(chuàng)建過(guò)session,服務(wù)器就按照session id把這個(gè)session檢索出來(lái)使用(如果檢索不到,可能會(huì)新建一個(gè),這種情況可能出現(xiàn)在服務(wù)端已經(jīng)刪除了該用戶對(duì)應(yīng)的session對(duì)象,但用戶人為地在請(qǐng)求的URL后面附加上一個(gè)JSESSION的參數(shù))。如果客戶請(qǐng)求不包含session id,則為此客戶創(chuàng)建一個(gè)session并且同時(shí)生成一個(gè)與此session相關(guān)聯(lián)的session id,這個(gè)session id將在本次響應(yīng)中返回給客戶端保存。

session機(jī)制本身并不復(fù)雜,然而其實(shí)現(xiàn)和配置上的靈活性卻使得具體情況復(fù)雜多變。這也要求我們不能把僅僅某一次的經(jīng)驗(yàn)或者某一個(gè)瀏覽器,服務(wù)器的經(jīng)驗(yàn)當(dāng)作普遍適用的。

小結(jié)

如上文所述,session和cookie的目的相同,都是為了克服http協(xié)議無(wú)狀態(tài)的缺陷,但完成的方法不同。session通過(guò)cookie,在客戶端保存session id,而將用戶的其他會(huì)話消息保存在服務(wù)端的session對(duì)象中,與此相對(duì)的,cookie需要將所有信息都保存在客戶端。因此cookie存在著一定的安全隱患,例如本地cookie中保存的用戶名密碼被破譯,或cookie被其他網(wǎng)站收集(例如:1. appA主動(dòng)設(shè)置域B cookie,讓域B cookie獲??;2. XSS,在appA上通過(guò)javascript獲取document.cookie,并傳遞給自己的appB)。

通過(guò)上面的一些簡(jiǎn)單介紹我們了解了cookie和session的一些基礎(chǔ)知識(shí),知道他們之間的聯(lián)系和區(qū)別,做web開(kāi)發(fā)之前,有必要將一些必要知識(shí)了解清楚,才不會(huì)在用到時(shí)捉襟見(jiàn)肘,或是在調(diào)bug時(shí)如無(wú)頭蒼蠅亂轉(zhuǎn)。接下來(lái)的幾小節(jié)我們將詳細(xì)介紹session相關(guān)的知識(shí)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)