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(七):中间件的使用和定义

我的公众号

最新文章都会在公众号上进行分享,欢迎各位大佬关注

相关文章
相关标签/搜索