Gin 框架的使用(1)https://developer.aliyun.com/article/1534251
1.2.8、拦截器(中间件)
在我们的 JavaWeb 项目中叫做拦截器,在 Go 语言的 Web 项目中一般叫中间件。
1、自定义拦截器
下面自定义一个拦截器,请求参数中必须包含 username ,如果用户名是 admin 则放行,否则阻止。此外,我们可以在拦截器中设置一些全局变量,如果一个请求设置了拦截器,那么就可以在这个请求的处理方法中获取拦截器中设置的参数。
// 自定义go中间件 (相当于Java中的拦截器) func interceptor() gin.HandlerFunc { return func(ctx *gin.Context) { // 通过自定义的中间件设置的值,后续都可以通过中间件访问到这个值 ctx.Set("usersession","user") username := ctx.Query("username") if username=="admin" { ctx.Next() // 放行 }else { ctx.Abort() // 阻止 } } }
2、注册拦截器
注意:如果注册之后没有在任何请求方法中使用拦截器,那么将作用于所有拦截器!如果指定了任意一个或多个拦截器,那么将只会作用于这些请求!
// 注册中间件 注册之后未使用的话默认全局使用 如果未注册或者给某个请求使用了这个中间件的话就只对这个请求生效 ginServer.Use(interceptor())
3、使用拦截器
// 这里设置了中间件 会先通过拦截器才能继续处理 ginServer.GET("/index",interceptor(),func(ctx *gin.Context) { // 取出中间件爱中的值 usersession := ctx.MustGet("usersession").(string) log.Println("=========> ",usersession) //ctx.JSON(200,gin.H{"msg":"返回 json 数据"}) ctx.HTML(http.StatusOK,"index.html",gin.H{ "msg":"这是go后端返回的数据", }) })
测试放行:
测试阻止:
1.3、Web 登录验证 Demo
下面做一个简单的用户登录界面验证,结合 MySQL:
1.3.1、登录界面 HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>登录页面</title> <link rel="stylesheet" href="/static/css/style.css"> </head> <body> <div class="login-container"> <h2>登录</h2> <form method="post" action="/login"> <label for="username">用户名:</label> <input type="text" name="username" required><br><br> <label for="password">密码:</label> <input type="password" name="password" required><br><br> <input type="submit" value="登录"> </form> </div> </body> </html>
1.3.2、CSS
body { font-family: Arial, sans-serif; background-color: #f4f4f4; } .login-container { width: 300px; padding: 16px; background-color: white; border-radius: 5px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } h2 { text-align: center; } input[type=text], input[type=password] { width: 100%; padding: 12px 20px; margin: 8px 0; display: inline-block; border: 1px solid #ccc; box-sizing: border-box; } input[type=submit] { width: 100%; background-color: #4CAF50; color: white; padding: 14px 20px; margin: 8px 0; border: none; border-radius: 4px; cursor: pointer; } input[type=submit]:hover { background-color: #45a049; }
1.3.3、Go 数据库查询代码
需要导入 mysql 的包,连接:
package util import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) const USERNAME,PASSWORD string = "root","Yan1029." // todo 公开的方法必须首字母大写才能被其它go文件调用 func Connect(username, password string) *sql.DB { db,err := sql.Open("mysql","root:Yan1029.@tcp(127.0.0.1:3306)/go_web?charset=utf8mb4") if err != nil { println("连接失败",err) } db.Ping() // 尝试连接数据库 return db } func Close(db *sql.DB) { if db != nil { db.Close() } } type User struct { id int username string password string } /** 查询用户是否已经注册 */ func HasUser(db *sql.DB,username,password string) bool { var user User querySql := "SELECT * FROM register_users WHERE username=? AND password=?" row := db.QueryRow(querySql,username,password) err := row.Scan(&user.id,&user.username,&user.password) if err!=nil { fmt.Print("查询失败",err) return false } return true }
1.3.4、Go 请求处理代码
package main // 导入 gin import ( "encoding/json" "fmt" "github.com/gin-gonic/gin" "github.com/thinkerou/favicon" "go1/util" "net/http" ) func main() { // 创建一个服务 ginServer := gin.Default() // 设置网页icon ginServer.Use(favicon.New("./sxau.ico")) // 加载静态页面 ginServer.LoadHTMLGlob("static/html/*") //ginServer.LoadHTMLFiles("static/index.html") // 加载指定的 HTML 文件 // 加载资源文件 ginServer.Static("/static","./static") ginServer.POST("/login", func(ctx *gin.Context) { // 获得登录参数 username := ctx.PostForm("username") password := ctx.PostForm("password") db := util.Connect(util.USERNAME,util.PASSWORD) if util.HasUser(db,username,password) { fmt.Println("存在该用户") ctx.HTML(http.StatusOK,"home.html",nil) }else{ fmt.Println("不存在该用户") ctx.HTML(http.StatusNotFound,"404.html",nil) } util.Close(db) }) // 服务器端口 ginServer.Run(":8082") // 默认 8080 }
测试:
输入正确的账号密码:
输入错误的账号密码:
总结
Go 语言开发 Web 应用还是特别简单的,比起 Java 肉眼可见的高效!确实是爽歪歪,下去好好了再去一下 Go 语言的一些基础!