Gin 框架的使用(2)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Gin 框架的使用

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 语言的一些基础!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Go API 网络架构
Gin框架快速入门1
Gin框架快速入门1
130 0
|
6月前
|
JSON 中间件 数据格式
Gin框架学习笔记(六)——gin中的日志使用
Gin框架学习笔记(六)——gin中的日志使用
286 0
|
6月前
|
JSON 前端开发 Java
|
6月前
|
JSON 中间件 API
Gin框架笔记(一) Gin框架的安装与Hello World
Gin框架笔记(一) Gin框架的安装与Hello World
230 0
|
7月前
|
XML JSON 人工智能
探索Gin框架:Golang Gin框架请求参数的获取
探索Gin框架:Golang Gin框架请求参数的获取
|
7月前
|
存储 人工智能 Go
探索Gin框架:Golang使用Gin完成文件上传
探索Gin框架:Golang使用Gin完成文件上传
|
JSON 中间件 数据库连接
gin 框架中的 gin.Context
Context 是 gin 中最重要的部分。 例如,它允许我们在中间件之间传递变量、管理流程、验证请求的 JSON 并呈现 JSON 响应。Context 中封装了原生的 Go HTTP 请求和响应对象,同时还提供了一些方法,用于获取请求和响应的信息、设置响应头、设置响应状态码等操作。
717 0
gin 框架中的 gin.Context
|
SQL 开发框架 安全
【Gin】初识Gin框架,模板基本语法
1.Gin介绍 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。如果你需要极好的性能,使用 Gin 吧
621 1
【Gin】初识Gin框架,模板基本语法
|
Go API
gin框架学习-快速安装gin
Gin 是一个用 Go (Golang) 编写的 Web 框架,由于 httprouter,它具有 martini 的 API,性能提高了 40 倍。具有高性能的优点。
168 0
gin框架学习-快速安装gin
|
开发工具
基于Gin封装Web框架 - 3. 初始化 rum 框架
基于Gin封装Web框架 - 3. 初始化 rum 框架
192 0
基于Gin封装Web框架 - 3. 初始化 rum 框架