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))
}

gin框架笔记的更多相关文章

  1. 前端程序员学习 Golang gin 框架实战笔记之一开始玩 gin

    原文链接 我是一名五六年经验的前端程序员,现在准备学习一下 Golang 的后端框架 gin. 以下是我的学习实战经验,记录下来,供大家参考. https://github.com/gin-gonic ...

  2. MyBatis 框架笔记

    Mybatis 框架笔记   ------技术源于热爱! 获取更多内容请关注小编的个人微信公众平台 1       Mybatis入门 1.1     单独使用jdbc编程问题总结 1.1.1  jd ...

  3. 基于gin框架和jwt-go中间件实现小程序用户登陆和token验证

    本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...

  4. gin框架使用注意事项

    gin框架使用注意事项 本文就说下这段时间我在使用gin框架过程中遇到的问题和要注意的事情. 错误处理请求返回要使用c.Abort,不要只是return 当在controller中进行错误处理的时候, ...

  5. Gin框架源码解析

    Gin框架源码解析 Gin框架是golang的一个常用的web框架,最近一个项目中需要使用到它,所以对这个框架进行了学习.gin包非常短小精悍,不过主要包含的路由,中间件,日志都有了.我们可以追着代码 ...

  6. gin框架学习手册

    前言 gin框架是go语言的一个框架,框架的github地址是:https://github.com/gin-gonic/gin 转载本文,请标注原文地址:https://www.cnblogs.co ...

  7. go的gin框架从请求中获取参数的方法

    前言: go语言的gin框架go里面比较好的一个web框架, github的start数超过了18000.可见此框架的可信度 如何获取请求中的参数 假如有这么一个请求: POST   /post/te ...

  8. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

  9. Go语言基础之20--web编程框架之Gin框架

    一.Gin框架介绍 1.1 简介 A. 基于httprouter开发的web框架. http://github.com/julienschmidt/httprouter B. 提供Martini风格的 ...

  10. Gin 框架 - 安装和路由配置

    目录 概述 Gin 安装 路由配置 推荐阅读 概述 看下 Gin 框架的官方介绍: Gin 是一个用 Go (Golang) 编写的 web 框架. 它是一个类似于 martini 但拥有更好性能的 ...

随机推荐

  1. Ansible介绍以及基于角色搭建LNMP和zabbix

    1 ansible 常用指令总结,并附有相关示例. /usr/bin/ansible 主程序,临时命令执行工具 /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ...

  2. Spring构造函数

    Spring构造函数 目录 Spring构造函数 一.分析说明 2.1.一个构造函数 java版本 xml配置版 2.2.多个构造函数 源码思路 为什么分越少优先级越高? 一.分析说明 Spring中 ...

  3. spring boot 跨域

    spring boot提供了两种跨域配置方式 1.全局跨域 2.局部跨域 全局跨域 package com.tons.config; import org.springframework.contex ...

  4. CF468E Permanent 题解

    考虑暴力状压 DP. 按行 DP,记录列哪些被选过,可以做到 \(O(2^kk^2)\). 注意到某一列扫完了之后这一列选没选过不重要,可以减少这里的状态. 简单优化一下,每次选择最少的一列,使这一列 ...

  5. b站m4s视频混流

    1.下载ffmpeg工具 https://ffmpeg.zeranoe.com/builds/ 这个网站估计是挂了. 由于 Zeranoe 已经不再编译.发布 FFMPEG,可从以下网址下载其他开发者 ...

  6. VUE学习-条件渲染

    条件渲染 v-if & v-else-if & v-else <div id="app"> <h1 v-if="type == 'VUE ...

  7. 肖sir___整理 电商详解__拼团活动

    电商平台营销活动设计--拼团活动设计 2022-11-29 18:02 拼团是指一定数量的消费者在规定时间内,组织成团,并因人数优势而获取额外优惠或其他利益的一种形式 一.简介 拼团作为一种营销活动, ...

  8. 2022-05-30内部群每日三题-清辉PMP

    1.对于一个长期的基础设施项目,由于全球商业环境,项目经理必须获得风险最小的供应商.项目经理应该使用什么合同类型? A.固定总价合同(FFP) B.成本加固定费用合同(CPFF) C.总价加激励费用合 ...

  9. Go语言中超过1000个线程panic

    1.问题描述 2.实验 3.原理 4.解释 Close太多,Close在Windows上阻塞型的可能会新创建线程,而Linux上是非阻塞型不会新创建线程.

  10. 只要引用这个js就会页面加载完毕自动弹出提示框

    IE浏览器不支持ES6语法, 此代码为翻译并修改过的,使用的bable网站翻译 (function (win) { // 生成遮罩和弹出层,返回弹出层DOM对象 var createMsgBox = ...