Gin 框架的使用(2)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 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 语言的一些基础!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
网络协议 Linux 数据安全/隐私保护
如何在Windows本地快速搭建SFTP文件服务器,并通过端口映射实现公网远程访问
如何在Windows本地快速搭建SFTP文件服务器,并通过端口映射实现公网远程访问
11000 1
|
9月前
|
前端开发 JavaScript Linux
用 Go 写桌面应用?试试 Wails 吧!
Wails 是一个结合 Go 语言与前端技术(如 Vue、React)开发轻量级桌面应用的框架。相比 Electron,它更轻、更快,资源占用更低,支持跨平台打包,适合熟悉 Web 开发又追求原生性能的开发者。
2205 0
|
存储 缓存 搜索推荐
session 详解:掌握客户端会话管理
session 详解:掌握客户端会话管理
|
JSON 前端开发 Java
|
Go API 数据库
【Go 语言专栏】Go 语言中的 ORM 框架使用与比较
【4月更文挑战第30天】本文对比分析了Go语言中的常见ORM框架:GORM、XORM和BeeORM。GORM功能强大,支持复杂查询和关联关系处理,但可能影响性能;XORM以其简单易用和高性能受到青睐,但文档不全;BeeORM简洁高效,适合基础应用场景。选择ORM应考虑功能、性能、易用性和社区支持,根据项目需求进行评估和选择,以提升开发效率和应用性能。
1078 0
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
1209 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
消息中间件 存储 NoSQL
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
本文档介绍了如何使用 Go 语言中的 `go-redis` 库操作 Redis 数据库
820 0
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
go select 使用总结
go select 使用总结
260 1
|
JSON 中间件 Go
Go语言Web框架Gin介绍
【7月更文挑战第19天】Gin是一个功能强大、高性能且易于使用的Go语言Web框架。它提供了路由、中间件、参数绑定等丰富的功能,帮助开发者快速构建高质量的Web应用。通过本文的介绍,你应该对Gin框架有了初步的了解,并能够使用它来开发简单的Web服务。随着你对Gin的深入学习和实践,你将能够利用它构建更复杂、更强大的Web应用。

热门文章

最新文章