gin默认中间件
在Gin中,为我们提供了gin.BasicAuth帮我们生成基本认证的中间件,方便我们的开发。
例:
r := gin.Default()
r.Use(gin.BasicAuth(gin.Accounts{
"admin": "123456",
}))
r.GET("/", func(c *gin.Context) {
c.JSON(200, "首页")
})
r.Run(":8080")
我们添加一个用户名为admin,密码是123456的账户,用于HTTP 基本认证。现在我们运行启动,访问http://localhost:8080/,这时候只有我们输入正确的用户名和密码,才能看到首页,否则是看不到的,这样我们就达到了授权的目的,就是这么简单。
针对特定的URL的Basic Authorization
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, "首页")
})
adminGroup := r.Group("/admin")
adminGroup.Use(gin.BasicAuth(gin.Accounts{
"admin": "123456",
}))
adminGroup.GET("/index", func(c *gin.Context) {
c.JSON(200, "后台首页")
})
r.Run(":8080")
}
路由中间件——一个路由可以注册多个中间件
r.GET("/login", func(a *gin.Context) {
fmt.Println("this is a middleware!")
//中间件 ---- 也可以之际将之抽离出来,直接调用函数即可
},func(a *gin.Context) {
a.HTML(200, "content/postto.html", gin.H{})
})
c.Next
例如:
//中间件函数
func ThisMiddleware(c *gin.Context) {
fmt.Println("this is a middleware!")
//不执行以下代码 直接匹配路由
c.Next() //可以在路由匹配后完成一些操作
//从此行代码后就是路由匹配完成后执行得代码
}
//路由调用中间件
r.GET("/login", ThisMiddleware, func(a *gin.Context) {
a.HTML(200, "content/postto.html", gin.H{})
})
c.Abort
例如:
//中间件函数
func ThisMiddleware(c *gin.Context) {
fmt.Println("this is a middleware!")
//不匹配路由
c.Abort() //不会再去匹配路由,仅仅执行中间件方法的内容
}
路由分组中配置中间件
adminRoutes := r.Group("/admin", middleware.InitMiddleware)//路由组使用中间件
{
adminRoutes.GET("/", admin.UserController{}.Index)
adminRoutes.POST("/userlist", func(a *gin.Context) {
})
}
全局中间件
/**
接上面代码
*/
r.Use(中间件函数名1,中间件函数名2......)//设置全局中间件
中间件和对应控制器之间共享数据
//middleware.InitMiddleware中间件中设置
c.Set("name", "梁鑫")
//哪个路由调用了该中间件
adminRoutes := r.Group("/admin", middleware.InitMiddleware)//路由组使用中间件
{
adminRoutes.GET("/", admin.UserController{}.Index)
adminRoutes.POST("/userlist", func(a *gin.Context) {
})
}
//上面路由调用了控制器-----admin.UserController{}.Index
所以在该控制器中可以获取到数据
func (con UserController) Index(r *gin.Context) {
username, _ := r.Get("name")
fmt.Println(username)
con.success(r)
}
中间件使用goroutine
介绍:当中间件或hander中启动新的goroutine时,不能使用原始的上下文(c *gin.Context),必须使用其只读副文本(c.Copy)
//定义一个goroutine统计日志
cCp := c.Copy()
go func() {
time.Sleep(5 * time.Second)
fmt.Println("Done! in path" + cCp.Request.URL.Path)
}()