Gin(八):cookie的使用

原文首發於 ISLANDhtml

上一章節咱們留下了一個小尾巴,那就是權限校驗中間件並滅有進行玩啥,那麼今天就對它進行完善。mysql

🍪 Cookies

接上回,如何來判斷用戶是否登陸呢? cookie 就是一個很好的憑證,cookie 會保留到瀏覽器上,每次訪問請求的時候就會攜帶上,後端經過對 cookie 的識別,來判斷用戶是否登陸。git

由此一來,首先咱們是要在登陸的時候保存 cookie 。修改 userHandlerUserLogin 代碼github

在判斷密碼正確的時候,對 cookie 進行添加。sql

context.SetCookie("user_cookie", string(u.Id), 1000, "/", "localhost", false, true)
複製代碼

這裏來介紹一下這些參數,第一個參數爲 cookie 名;第二個參數爲 cookie 值;第三個參數爲 cookie 有效時長,當 cookie 存在的時間超過設定時間時,cookie 就會失效,它就再也不是咱們有效的 cookie;第四個參數爲 cookie 所在的目錄;第五個爲所在域,表示咱們的 cookie 做用範圍;第六個表示是否只能經過 https 訪問;第七個表示 cookie 是否能夠經過 js代碼進行操做。後端

啓動咱們的項目,進行登陸操做,F12 打開咱們的控制檯,選擇Application ,在側邊欄找到 cookie,而且選擇咱們的站點,此時就能夠在咱們的右側看到咱們剛剛設置的 cookie 信息瀏覽器

查看cookie

而且有 Expires/Max-Age 屬性,該屬性表示 cookie 的過時時間,一旦超過這個時間,cookie 就會自動消失。安全

此時,已經代表咱們的 cookie 設置成功。cookie

🥞經過中間件獲取Cookie

既然 cookie 已經獲取成功,那麼就該對咱們新寫的 Auth 中間件進行修改了。函數

咱們首先創建一個 401.tmpl 文件,用於展現咱們的權限不足時的信息。

{{template "header"}}

{{template "nav"}}

請先登陸:<a href="/">首頁</a>
複製代碼

當咱們要訪問須要權限的路由時,恰巧咱們權限不足,就會轉跳到該頁面。

此時再完善咱們的中間件。

func Auth() gin.HandlerFunc {
	return func(context *gin.Context) {
		_, e := context.Request.Cookie("user_cookie")
		if e == nil {
			context.Next()
		} else {
			context.Abort()
			context.HTML(http.StatusUnauthorized, "401.tmpl", nil)
		}

	}
}
複製代碼

在這裏咱們經過 context.Request.Cookie() 來獲取指定的 cookie 。這裏還有一個函數 context.Abort()表示對當前的請求進行停止。

從新啓動項目,直接去訪問 http://localhost:8080/user/profile/?id=5,會出現咱們的401 頁面。當咱們登陸後再進行訪問,就能夠正常訪問。

此時此刻說明咱們的 auth 中間件起到了做用。

🔄刷新 cookie

在上面的 cookie 設置中有一個參數是爲了設置過時時間,那麼過時時間到底設置多長呢?過時時間設置過長,那麼可能留下安全隱患,若是設置太短,又給用戶帶來不方便。

因此咱們要在 cookie 請求成功的時候自動刷新咱們的 cookie 時間。

修改咱們中間件代碼。

首先是獲取到原來的 cookie ,而後就是從新設置一個 cookie

func Auth() gin.HandlerFunc {
	return func(context *gin.Context) {
		cookie, e := context.Request.Cookie("user_cookie")
		if e == nil {
			context.SetCookie(cookie.Name, cookie.Value, 1000, cookie.Path, cookie.Domain, cookie.Secure, cookie.HttpOnly)
			context.Next()
		} else {
			context.Abort()
			context.HTML(http.StatusUnauthorized, "401.tmpl", nil)
		}
	}
}
複製代碼

從新啓動咱們的項目,仍舊是打開咱們項目的控制檯,每次訪問須要權限的接口時,都會看到cookie的過時時間在從新刷新。

✍總結

本章節主要講述了 cookie 如何添加,如何獲取,又如何經過中間件來校驗 cookie 和刷新 cookie

👩‍💻本章節代碼

Github

推薦閱讀

Gin(一):Hello
Gin(二):路由Router
Gin(三):模板tmpl
Gin(四):表單提交校驗和模型綁定
Gin(五):鏈接MySQL
Gin(六):文件的上傳
Gin(七):中間件的使用和定義

我的公衆號

最新文章都會在公衆號上進行分享,歡迎各位大佬關注

相關文章
相關標籤/搜索