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. Windows常用指令与常见问题

    关键目录 启动目录:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup hosts:C:\Windows\System32\dri ...

  2. JZOJ 4250.路径

    \(\text{Solution}\) \(30\) 分暴搜合法路径 另 \(30\) 分状压 设 \(f_{i,j,k}\) 表示当前到第 \(i\) 个点,走过的点状态为 \(j\),走过的路径长 ...

  3. 11款Linux数据恢复工具!

    转载:<Linux就该这么学> - 必读的Linux系统与红帽RHCE认证免费自学书籍 (linuxprobe.com) 11款最棒的Linux数据恢复工具发布啦! | <Linux ...

  4. CSS3,线性渐变(适用标题背景)

    .test{ margin:200px auto; height:30px; border:1px #D4D4D4 solid; box-shadow:0 -1px 10px rgba(0,0,0,0 ...

  5. Vue2安装less版本过高问题,需要降级

    安装指定less版本解决: -D: 本地安装 -g: 全局安装 npm install less@3.9.0 less-loader@5.0.0 -D

  6. flask + gunicorn + nginx

    详解见网址:https://www.jianshu.com/p/dba83a473f12,问题解决:https://blog.51cto.com/yanconggod/1983494 我的配置:htt ...

  7. vue学习笔记:组件

    组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码,说白了就是一组可以重复使用的模板.组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽 ...

  8. DevExpress gridControl 字体居住

    设置列的标题居中显示: Designer - Views -右侧输入框中输入Appearance-HeaderPanel-TextOptions-设置HAlignment为Center 设置单元格内容 ...

  9. mybatis处理一对多的映射关系

    实体类 package org.example.entity; import java.util.List; public class Dept { private Integer deptId; p ...

  10. BackTrader 简单BTC的SMA15回测DEMO

    import time import requests import json import csv from requests.packages.urllib3 import disable_war ...