首页 > 其他分享 >go语言学习-gin框架会话控制

go语言学习-gin框架会话控制

时间:2023-04-13 18:03:51浏览次数:43  
标签:http err ctx 会话 session cookie go gin

cookie介绍

  • HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出
  • Cookie就是解决HTTP协议无状态的方案之一,中文是小甜饼的意思
  • Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求
  • Cookie由服务器创建,并发送给浏览器,最终由浏览器保存
  • 测试服务端发送cookie给客户端,客户端请求时携带cookie

cookie使用

测试服务端发送cookie给客户端,客户端请求时携带cookie

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

// 测试服务端发送cookie给客户端,客户端请求时带有路由
func main() {
	r := gin.Default()
	//服务端要给客户端cookie
	r.GET("cookie", func(ctx *gin.Context) {
		//获取客户端是否携带cookie
		cookie, err := ctx.Cookie("key_cookie")
		if err != nil {
			cookie = "NotSet"
			//给客户端设置cookie
			//MaxAge,int单位位秒
			//path,cookie所在目录
			//domain string 域名
			//secure是否只能通过https访问
			//httpOnly bool,是否允许别人通过js获取自己的cookie
			ctx.SetCookie("key_cookie", "vaule_cookie", 60, "/", "localhost", false, true)
		}
		//fmt.Printf("cookie的值是: %s\n", cookie)
		ctx.JSON(http.StatusOK, gin.H{
			"cookie的值是": cookie,
		})
	})
	r.Run()
}

客户端不带cookie时访问,同时客户端已经将cookie添加

go语言学习-gin框架会话控制_服务器


go语言学习-gin框架会话控制_客户端_02

cookie练习

  • 模拟实现权限验证中间件
  • 有2个路由,login和home
  • login用于设置cookie
  • home是访问查看信息的请求
  • 在请求home之前,先跑中间件代码,检验是否存在cookie
package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

/*
模拟实现权限验证中间件

有2个路由,login和home
login用于设置cookie
home是访问查看信息的请求
在请求home之前,先跑中间件代码,检验是否存在cookie
*/

func AuthMiddleWare() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		//获取客户端的cookie并校验
		if cookie, err := ctx.Cookie("abc"); err == nil {
			if cookie == "123" {
				ctx.Next()
				return
			}
		}
		//返回错误
		ctx.JSON(http.StatusUnauthorized, gin.H{
			"error": "err",
		})
		//若验证不通过,不再强调后续的函数处理
		ctx.Abort()
		return
	}
}

func main() {
	//创建路由
	r := gin.Default()
	r.GET("/login", func(ctx *gin.Context) {
		//设置cookie
		ctx.SetCookie("abc", "123", 60, "/", "localhost", false, true)
		//返回信息
		ctx.String(200, "Login success!")
	})
	r.GET("/home", AuthMiddleWare(), func(ctx *gin.Context) {
		ctx.JSON(200, gin.H{
			"data": "home",
		})
	})
	r.Run()
}

第一访问/home,会显示错误,因为权限校验没有通过

go语言学习-gin框架会话控制_客户端_03

然后访问login,登陆并设置了cookie返回给客户端

go语言学习-gin框架会话控制_客户端_04

go语言学习-gin框架会话控制_客户端_05

再次访问home,访问成功

go语言学习-gin框架会话控制_服务器_06

session

主要功能是:

  • 简单的API:将其用作设置签名(以及可选的加密)cookie的简便方法。
  • 内置的后端可将session存储在cookie或文件系统中。
  • Flash消息:一直持续读取的session值。
  • 切换session持久性(又称“记住我”)和设置其他属性的便捷方法。
  • 旋转身份验证和加密密钥的机制。
  • 每个请求有多个session,即使使用不同的后端也是如此。
  • 自定义session后端的接口和基础结构:可以使用通用API检索并批量保存来自不同商店的session。
package main

import (
	"fmt"
	"net/http"

	"github.com/gorilla/sessions"
)

// 初始化一个cookie存储对象
// something-very-secret是一个自己的密钥
var store = sessions.NewCookieStore([]byte("something-very-secret"))

func SaveSession(w http.ResponseWriter, r *http.Request) {
	// 得到一个session,忽略从解码结果的错误
	//存在session: GET()方法总是返回一个会话,哪怕是空的
	//获取一个session对象,session-name是session的名字
	sessions, err := store.Get(r, "session-name")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	//在session中存储值
	sessions.Values["foo"] = "bar"
	sessions.Values[42] = 43
	//保存更改
	sessions.Save(r, w)

}

func GetSession(w http.ResponseWriter, r *http.Request) {
	sessions, err := store.Get(r, "session-name")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	foo := sessions.Values["foo"]
	fmt.Println(foo)

}

func main() {
	http.HandleFunc("/save", SaveSession)
	http.HandleFunc("/get", GetSession)
	err := http.ListenAndServe(":8000", nil)
	if err != nil {
		fmt.Println("HTTP server failed,err:", err)
		return
	}

}


标签:http,err,ctx,会话,session,cookie,go,gin
From: https://blog.51cto.com/u_11555417/6188290

相关文章

  • 详解Django admin高级用法
    Django后台admin有大量的属性和方法,拥有强大的功能和自定义能力.通过完整的代码来看Djangoadmin的基础设置和高级用法,并结合form表单来实现深度自定义.简单使用如果只是使用admin自带的数据管理功能,只需要将模型注册到admin中,就可以实现.fromdjango.contribimportadmi......
  • Go For Web:踏入Web大门的第一步——Web 的工作方式
    前言:本文作为解决如何通过Golang来编写Web应用这个问题的前瞻,对Golang中的Web基础部分进行一个简单的介绍。目前Go拥有成熟的Http处理包,所以我们去编写一个做任何事情的动态Web程序应该是很轻松的,接下来我们就去学习了解一些关于Web的相关基础,了解一些概念,以及......
  • MegEngine 使用小技巧:使用 Optimizer 优化参数
    神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为优化(optimization)。而由于参数空间复杂、参数数量庞大等原因,使得神经网络的优化问题非常难。MegEngine的optimizer模块中实现了大量的优化算法,其中Optimizer是所有优......
  • golang 指针自动解引用
    在Go中,对指针类型进行解引用操作可以使用星号(*)运算符。如果要自动解引用一个指针,可以使用点号(.)运算符来访问其字段或方法,Go会在必要时自动解引用该指针。例如,假设有一个结构体类型的指针变量p,其中包含一个整数字段x:typemyStructstruct{xint}funcmain(){......
  • 在Django+Vue3+GraphQL的Blog例子代码中引入Element-Plus UI Framework
    Vue3的UIFramework中有Element-Plus、BalmUI、Quasar、PrimeVue、AntDesignVue等UIFramework.Element-Plus是Element-UI的Vue3版,Element-UI的使用人数的基数较大,Github上的Star数也较多,就选择了Element-Plus作为这个Blog项目的UIFramework.UIFramework的好处就是提供了......
  • Golang的GMP模型
    一、调度器的由来和分析单进程时代的两个问题:单一执行流程、计算机只能一个任务一个任务处理进程阻塞所代理的CPU浪费时间多进程和多线程的问题:多进程/多线程解决了阻塞问题但是引入了新的问题进程/线程的数量越多,切换成本就越大,也就越浪费多线程随着同步竞争(如锁、......
  • MegEngine 使用小技巧:使用 Optimizer 优化参数
    神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为优化(optimization)。而由于参数空间复杂、参数数量庞大等原因,使得神经网络的优化问题非常难。MegEngine的optimizer模块中实现了大量的优化算法,其中Optimizer是所有......
  • 【D02】Bootstrap免费精选模板推荐,附上Django中使用模板教程
    前端模板-AnchorUIKIT前言今天介绍一款制作精良、开源、免费的Bootstrap模板——AnchorUIKIT该模板使用的是Bootstrapv4版本本文将介绍如何在Django中导入该模板的静态资源包并使用介绍官方文档Anchor-afreeBootstrapUIKit(bootcss.com)预览官方文档......
  • Lecture#11 Joins Algorithms
    1Joins在关系型数据库中,我们常常通过规范化(Normalization)设计避免信息冗余;因此查询时,就需要通过Join将不同table中的数据合并来重建数据。本课关注双表的内等值连接。原则上我们希望,连接时将小表放到左侧(作为外表)。首先要讨论的是:Join的输出和成本分析。1.1Oper......
  • mongoDB操作指南
    目录1.docker安装mongoDB2.库-database3.集合-collection3.1命名规范3.2增-createCollection3.3删-drop4.文档-document4.1命名规范4.2增-insert,insertMany(单个增,批量增)4.2.1insertOne-单个增4.2.2insertMany-批量增4.2.3insert-单个增或批量增4.3查-find4.3.1find......