1、实现http://127.0.0.1:8080/index.html的形式访问前端页面。gin-contrib/static 使用中间件的方式判断是否存在该静态文件。fileserver 是一个 Handler,判断 fs 中是否有请求的文件,如果有则使用 fileserver 将文件写入到 gin 的 writer 里面返回,否则就不处理,中间件处理结束之后就会去匹配对应的 api

//htmlfile为html文件存放的文件夹
r.Use(static.Serve("/", static.LocalFile("./htmlfile/", false)))

2、跨域

方法1、

func Cors() gin.HandlerFunc {
return func(c *gin.Context) {
method := c.Request.Method c.Header("Access-Control-Allow-Origin", "*")
c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
c.Header("Access-Control-Allow-Credentials", "true") //放行所有OPTIONS方法
if method == "OPTIONS" {
c.AbortWithStatus(http.StatusNoContent)
}
// 处理请求
c.Next()
}
} //添加到中间件
r.Use(Cors())

方法2、

import (
"github.com/gin-contrib/cors"
) corsMiddleWare := cors.Default()
r.Use(corsMiddleWare)

session

type user struct {
Id string
Name string
} func Sessions() { r := gin.Default()
//创建基于cookie的存储引擎,secret参数是用于加密的密钥
store := cookie.NewStore([]byte("secret"))
//路由上加入session中间件,参数mysession,指的是session的名字,也是cookie的名字
r.Use(sessions.Sessions("mysession", store))
//session 使用的编解码器是自带的gob,所以存储类似: struct、map 这些对象时需要先注册对象,不然会报错
gob.Register(user{})
}
//session 在创建时有一个配置项,可以配置session过期时间、cookie、domain、secure、path等参数
store.Options(sessions.Options{ Secure: true, SameSite: 4, Path: "/", MaxAge: m.MaxAge, })
//调用 session 方法: Set()、 Delete()、 Clear()、方法后,必须调用一次 Save() 方法。否则session数据不会更新

如果已登录。向前端返回session中存储的id和那么

//session.Get()得到的值类型为interface,无法直接返回,需要转为string
func sessionHandler(c *gin.Context) {
session := sessions.Default(c)
//session := sessions.Default(c)
Id := session.Get("Id")
Name := session.Get("Name")
if Id != nil && Name != nil {
data := gin.H{"user_id": Id.(uint), "name": Name.(string)}
c.JSON(http.StatusOK, gin.H{
"errno": "0", "errmsg": "OK", "data": data})
} else {
c.JSON(http.StatusOK, gin.H{
"errno": "4101", "errmsg": "未登录",
})
} }

gin框架使用base64Captch+redis实现图片验证码。

//只需要普通图片验证码,可以把audio、chinese等验证码代码删掉
package captcha import (
"fmt"
"github.com/mojocn/base64Captcha"
"iHome/Databases"
"time"
) const CAPTCHA = "captcha:" type RedisStore struct {
} //// 默认存储10240个验证码,每个验证码10分钟过期
//var store = base64Captcha.DefaultMemStore
//配置RedisStore RedisStore实现base64Captcha.Store的接口
var store base64Captcha.Store = RedisStore{} type configJsonBody struct {
Id string
CaptchaType string
VerifyValue string
DriverString *base64Captcha.DriverString
DriverAudio *base64Captcha.DriverAudio
DriverChinese *base64Captcha.DriverChinese
DriverMath *base64Captcha.DriverMath
DriverDigit *base64Captcha.DriverDigit
} // 生成图片验证码,并且实现需求:验证码id为前端传来的uuid
func GenerateCaptcha(uuid string) (id, b64s string, err error) {
// 生成默认数字
//driver := base64Captcha.DefaultDriverDigit
// 此尺寸的调整需要根据网站进行调试,链接:
// https://captcha.mojotv.cn/
var driver base64Captcha.Driver
var param configJsonBody = configJsonBody{
Id: "string",
CaptchaType: "string",
VerifyValue: "",
DriverString: &base64Captcha.DriverString{
Length: 4,
Height: 60,
Width: 240,
ShowLineOptions: 2,
NoiseCount: 0,
Source: "1234567890qwertyuioplkjhgfdsazxcvbnm",
},
}
////ConvertFonts 按名称加载字体
switch param.CaptchaType {
case "audio":
driver = param.DriverAudio
case "string":
driver = param.DriverString.ConvertFonts()
case "math":
driver = param.DriverMath.ConvertFonts()
case "chinese":
driver = param.DriverChinese.ConvertFonts()
default:
driver = param.DriverDigit
}
c := base64Captcha.NewCaptcha(driver, store)
_, content, answer := c.Driver.GenerateIdQuestionAnswer()
id = uuid
item, err := c.Driver.DrawCaptcha(content)
if err != nil {
return "", "", err
}
err = c.Store.Set(id, answer)
if err != nil {
return "", "", err
}
b64s = item.EncodeB64string()
return } //如果使用轮子自己生成的id
//func generateCaptcha() (id, b64s string, err error) {
// //var driver = NewDriver().ConvertFonts()
// var driver base64Captcha.Driver
// //配置验证码的参数
// driverString := base64Captcha.DriverString{
// Height: 40,
// Width: 100,
// NoiseCount: 0,
// ShowLineOptions: 2 | 4,
// Length: 4,
// Source: "1234567890qwertyuioplkjhgfdsazxcvbnm",
// BgColor: &color.RGBA{R: 3, G: 102, B: 214, A: 125},
// Fonts: []string{"wqy-microhei.ttc"},
// }
// driver = driverString.ConvertFonts()
// c := base64Captcha.NewCaptcha(driver, store)
// return c.Generate()
//} //实现设置captcha的方法
func (r RedisStore) Set(id string, value string) error {
key := CAPTCHA + id
//time.Minute*2:有效时间2分钟
err := Databases.RedisDb.Set(key, value, time.Minute*20).Err()
return err
} //实现获取captcha的方法
func (r RedisStore) Get(id string, clear bool) string {
key := CAPTCHA + id
val, err := Databases.RedisDb.Get(key).Result()
if err != nil {
fmt.Println(err)
return ""
}
if clear {
//clear为true,验证通过,删除这个验证码
err := Databases.RedisDb.Del(key).Err()
if err != nil {
fmt.Println(err)
return ""
}
}
return val
} // 校验图片验证码,并清除内存空间
//实现验证captcha的方法
func (r RedisStore) Verify(id, answer string, clear bool) bool {
v := RedisStore{}.Get(id, clear)
//fmt.Println("key:"+id+";value:"+v+";answer:"+answer)
return v == answer
}
func CapthcaVerify(id, answer string) bool {
s := store.Verify(id, answer, true)
return s
} //返回格式:图片类型
//content_type='image/jpg'
func getCaptchaHandler(c *gin.Context) {
//获取前端传来的uuid
cur := c.Query("cur")
//pre := c.Query("pre")
_, b64s, err := captcha.GenerateCaptcha(cur)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 2001,
"errmsg": "参数错误",
})
return
}
mypngList := strings.Split(b64s, ",")
mypng := mypngList[len(mypngList)-1]
imageBuffer, _ := base64.StdEncoding.DecodeString(mypng)
_, _ = c.Writer.WriteString(string(imageBuffer))
}

最新文章

  1. 学会使用notepad++
  2. Moqui简介
  3. 关于ListView中notifyDataSetChanged()刷新数据不更新原因
  4. 解决JVM最大内存设置问题
  5. unity 多线程
  6. 设计模式学习——准备(UML类图)
  7. 【转载】小结一下linux 2.6内核的四种IO调度算法
  8. OpenCV 2.x/3.x 随机初始化矩阵
  9. (翻译)W3C的Turtle文档
  10. 程序员如何面试才能拿到offer
  11. poj 3685 Matrix 【二分】
  12. 论文笔记之:Semi-supervised Classification with Graph Convolutional Networks
  13. jenkins+findbugs+checkstyle+PMD静态代码检查(二)
  14. Redis集群架构【转载】
  15. form表单中使用a标签代替button或commit进行数据提交
  16. FPM打包工具 可以把源码包制定为rpm包 是自动化部署的环节
  17. open-falcon之HBS
  18. ASP.NET MVC API 接口验证
  19. Spring Security核心概念介绍
  20. Flume启动报错[ERROR - org.apache.flume.sink.hdfs. Hit max consecutive under-replication rotations (30); will not continue rolling files under this path due to under-replication解决办法(图文详解)

热门文章

  1. 微信小程序 添加域名
  2. NetApp DataONTAP 集群模式 学习笔记1
  3. location.search
  4. 基于Python的OpenGL 01 之Hello Triangle
  5. 花10几元买ESP32-C3,体验一下MicroPython (和CircuitPython)
  6. ASP.NET Core - 依赖注入(四)
  7. redis(13)持久化操作-AOF
  8. axios的简易二次封装
  9. AD域安装后无法打开网络适配器,提示无法访问指定设备,路径或文件,你可能没有。。。
  10. N63050 第十六周运维作业