Gin(八):cookie的使用

【Golang】关于Gin框架中的Cookie和Session 在深入探讨Cookie和Session之前,我们需要了解HTTP协议的无状态特性。简单来说,HTTP是一种无状态协议,即每次请求与响应之间都是独立的,服务器不会记住之前的状态信息。这意味着,当用户从一个页面跳转到另一个页面时,服务器无法自动识别这是同一个用户的请求。为了实现跨请求的数据共享,我们可以使用Cookie和Session。本文将结合实际案例,详细介绍在Go语言的Gin框架中如何使用Cookie和Session。 阅读详情

上一章节我们留下了一个小尾巴,那就是权限校验中间件并没有进行完善,那么今天就对它进行完善。

? Cookies

接上回,如何来判断用户是否登录呢? cookie 就是一个很好的凭证,cookie 会保留到浏览器上,每次访问请求的时候就会携带上,后端通过对 cookie 的识别,来判断用户是否登录。

由此一来,首先我们是要在登录的时候保存 cookie 。修改 userHandler 中 UserLogin 代码

在判断密码正确的时候,对 cookie 进行添加。

context.SetCookie("user_cookie", string(u.Id), 1000, "/", "localhost", false, true)

这里来介绍一下这些参数,第一个参数为 cookie 名;第二个参数为 cookie 值;第三个参数为 cookie 有效时长,当 cookie 存在的时间超过设定时间时,cookie 就会失效,它就不再是我们有效的 cookie;第四个参数为 cookie 所在的目录;第五个为所在域,表示我们的 cookie 作用范围;第六个表示是否只能通过 https 访问;第七个表示 cookie 是否可以通过 js代码进行操作。

启动我们的项目,进行登录操作,F12 打开我们的控制台,选择Application ,在侧边栏找到 cookie,并且选择我们的站点,此时就可以在我们的右侧看到我们刚刚设置的 cookie 信息

查看cookie

并且有 Expires/Max-Age 属性,该属性表示 cookie 的过期时间,一旦超过这个时间,cookie 就会自动消失。

此时,已经表明我们的 cookie 设置成功。

?通过中间件获取Cookie

既然 cookie 已经获取成功,那么就该对我们新写的 Auth 中间件进行修改了。

我们首先建立一个 401.tmpl 文件,用于展示我们的权限不足时的信息。

{{template "header"}}

{{template "nav"}}

请先登录:<a href="/">首页</a>

当我们要访问需要权限的路由时,恰巧我们权限不足,就会转跳到该页面。

此时再完善我们的中间件。

func Auth() gin.HandlerFunc {
	return func(context *gin.Context) {
		_, e := context.Request.Cookie("user_cookie")
		if e == nil {
			context.Next()
		} else {
			context.Abort()
			context.HTML(http.StatusUnauthorized, "401.tmpl", nil)
		}

	}
}

在这里我们通过 context.Request.Cookie() 来获取指定的 cookie 。这里还有一个函数 context.Abort()表示对当前的请求进行中止。

重新启动项目,直接去访问 http://localhost:8080/user/profile/?id=5,会出现我们的401 页面。当我们登录后再进行访问,就可以正常访问。

此时此刻说明我们的 auth 中间件起到了作用。

?刷新 cookie

在上面的 cookie 设置中有一个参数是为了设置过期时间,那么过期时间到底设置多长呢?过期时间设置过长,那么可能留下安全隐患,如果设置过短,又给用户带来不方便。

所以我们要在 cookie 请求成功的时候自动刷新我们的 cookie 时间。

修改我们中间件代码。

首先是获取到原来的 cookie ,然后就是重新设置一个 cookie。

func Auth() gin.HandlerFunc {
	return func(context *gin.Context) {
		cookie, e := context.Request.Cookie("user_cookie")
		if e == nil {
			context.SetCookie(cookie.Name, cookie.Value, 1000, cookie.Path, cookie.Domain, cookie.Secure, cookie.HttpOnly)
			context.Next()
		} else {
			context.Abort()
			context.HTML(http.StatusUnauthorized, "401.tmpl", nil)
		}
	}
}

重新启动我们的项目,仍旧是打开我们项目的控制台,每次访问需要权限的接口时,都会看到cookie的过期时间在重新刷新。

✍总结

本章节主要讲述了 cookie 如何添加,如何获取,又如何通过中间件来校验 cookie 和刷新 cookie

?‍?本章节代码

Github

个人公众微信号

文章与个人公众号同步更新,欢迎各位扫码关注。
在这里插入图片描述

gin框架自带的一些的鉴定权限机制 session cookie 文章目录gin.Cookie() 使用gin.BasicAuth() 中间件github.com/gin-contrib/sessions 包实际生产中使用鉴权方式 gin.Cookie() 使用 下面的小例子可以使用 postman 来请求,只要服务启动了,其实主要就是 Cookie 函数来拿到请求头的 value,用 SetCookie 函数来设置 cookie 的 value func main() { r := gin.Default() r.Get("/cookie", handler.M 阅读详情

相关推荐

【Golang】Gin框架中如何使用JWT来实现登录认证

JWT: JSON Web Token,是一种用于身份验证和授权的开放标准,JWT可以在网络应用间安全的传输。JWT由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature) JWT具有可扩展性、简单、轻量级、跨语言等优点,是前后端分离框架中最常用的验证方式。

景天科技苑 5万+

Gin(八): Cookie 的使用

点击蓝色字关注我们!一个努力中的公众号长的好看的人都关注了上一章节我们留下了一个小尾巴,那就是权限校验中间件并没有进行完善,那么今天就对它进行完善。

代码猎奇站 1912

谈谈.Net Core 中Cookie骚操作

前言 一个大佬写的东西,看到一半就看不懂了,先收藏收藏 作者简介:Jon(Jonathan)Seeley,一位资深.NET开发者,主要从事Asp.NET/Asp.NET CORE/WPF等技术栈的开发,他的博客地址为https://www.seeleycoder.com/。 对于那些习惯于在传统ASP.NET中使用Cookie的人来说,改用ASP.NET Core可能会让我们抓狂。在旧系统中...

覃鸿宇的博客 2424

稳压二极管选型指南:关键参数与电路稳定性优化

本文深入解析了稳压二极管在电路设计中的核心作用与选型要点。文章详细阐述了稳定电压、动态电阻、额定功耗等关键参数对电路稳定性的影响,并结合实战案例,提供了从需求分析到参数验证的系统化选型流程与优化策略,帮助工程师避免常见设计陷阱,实现电路稳定性优化。

weixin_29196891的博客 687

从零搭建Obsidian智能知识库:Ollama本地模型与Copilot插件实战指南

本文详细介绍了如何从零搭建Obsidian智能知识库,结合Ollama本地模型与Copilot插件实现高效知识管理。通过本地部署AI助手,用户可以在保证隐私安全的同时,快速检索和整理笔记,提升工作效率。文章涵盖硬件准备、Ollama部署、插件配置及实战技巧,适合需要高效知识管理的专业人士。

weixin_29230773的博客 632

ASP.NET中Cookie编程简明参考

ASP.NET中Cookie编程简明参考   一 写入Cookie  1. Name 和 Value 属性由程序设定,默认值都是空引用。  2. Domain属性的默认值为当前URL的域名部分,不管发出这个cookie的页面在哪个目录下的。  例如,http://www.kent.com/application1/login.aspx 页面中发出一个cookie,Domain属性缺省就是www.k

东哥技术专栏 - Coldwine's Blog 1108

5分钟搞定!用扣子空间LinkReaderPlugin快速搭建网页内容抓取机器人(附Python复现代码)

本文详细介绍了如何利用扣子空间的LinkReaderPlugin快速搭建网页内容抓取机器人,仅需5分钟即可完成配置。通过Python复现代码和可视化工作流,开发者可以轻松实现智能网页抓取,提升数据采集效率。文章还探讨了与RAG工作流的集成方案及性能优化技巧,适用于金融监控、电商追踪等多种场景。

study的专栏 1093

C#服务器端读写cookie

<br />通过js读写cookie,大家都知道,在服务器端,怎么读写cookie呢?<br />读cookie:<br />        string cookie = context.Request.Cookies["guid"] == null ? "" : context.Request.Cookies["guid"].Value as string;<br />写cookie:<br />         string cookie = Guid.NewGuid().ToString();<br

心灵净土 3087

深入解析STM32驱动AT25DF321A FLASH芯片的SPI通信与数据完整性验证

本文深入解析STM32通过SPI通信驱动AT25DF321A FLASH芯片的全过程,包括硬件连接、驱动函数实现与数据完整性验证。重点介绍SPI配置、读写操作优化及CRC校验方法,确保数据存储的可靠性,为嵌入式存储系统开发提供实用指南。

agile9scrum的博客 1065

ETAS工具导入Com Arxml修改步骤

通讯协议栈开发一般通过导入DBC实现,ETAS工具本身导入DBC也是生成arxml后执行cfggen,本文介绍直接导入客户提供的arxml文件,实现通讯协议栈的生成。通过Arxml导入相比于DBC来说,少了从DBC转为arxml的过程。而且arxml中能提供的信息也会更多。如果是DBC的话,很多信息(如PNC的映射,CANTP的配置等)都需要额外配置。不过还有连DBC都无法提供的,那就更麻烦了~

赞的博客 1541

ASP.NET中多线程如何获取cookie值的问题

今天被一个问题困扰,ASP.NET代码一直无法获取cookie值,代码就是大家时常在写的获取cookie代码,不过是写在一般处理程序页面。 包括: 1、context.Request.Cookies["userInfo"]["UserName"] 2、HttpCookie cookie = HttpContext.Current.Request.Cookies["userInfo"]; 等...

程序员的专栏 570

备考路上的学习笔记:我的软考高级架构师复盘与更新计划

本专栏基于作者备考软考高级系统架构设计师的真实经验,分为考前突击、基础夯实、核心突破、案例实战和论文通关五大模块。内容涵盖计算机体系结构、操作系统、数据库等核心知识,提供案例解析和论文范文。作者承诺持续更新考纲内容、真题复盘及互动答疑,旨在帮助考生系统备考,将个人踩坑经验转化为实用指南,陪伴考生共同完成从知识碎片到体系构建的蜕变历程。

qq837993702的博客 2295

Gin 中使用 Cookie,Session

HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页 面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何 关系的。如果我们要实现多个页面之间共享数据的话我们就可以使用 Cookie,Session或Token实 现cookie 是存储浏览器中的键值对,可以让我们用同一个浏览器访问同一个域名 的时候共享数据session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。

go|Python的个人博客 2084

基于STM32设计的便携式心电信号监测系统_146

基于STM32 设计的便携式心电信号监测系统,采用 PulseSensor 心率传感器进行数据采集,通过 LCD 显示屏显示心电数字数据和采集状态。同时,该系统还采用 HC05 蓝牙模块将实时心电信号数据传输到手机 APP,用户可以在手机 APP 上实时查看采集的数据并绘制心率曲线。此外,STM32 上的按键可以控制心率采集状态,用户登录手机 APP 还可以查看实时心电信号折线图。

1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Gin】Gin 当中使用 Cookie 和 Session

Gin 当中使用 Cookie 和 Session

徒挽的博客 1392

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Gin 框架之Cookie与Session

Cookie是服务器保存在客户端浏览器之上的key-value键值对 :它是随着服务器的响应发送给客户端, 客户端将其保存, 下一次请求时会将Cookie放在其中, 服务器通过识别Cookie就能知道是哪个客户端浏览器存放在服务器上的键值对 :Cookie可以保存状态, 但本身最大只能支持4069字节, 并且不安全, 于是就出现了Session它能支持更多字节, 并且保存在服务端上, 具有较高的安全性,Session基于Cookie, 本地存放服务器返回给浏览器的随机字符串。

淘小欣的博客 2110

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

gin 设置cookie

不知道为什么用gin.Context的SetCookie方法设置不到cookie,有待研究 一位伟大的网友记录的方法,学习一下 参考链接 package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" "strconv" ) func main() { r := gin.Default(...

Tony10010的博客 1730

【Gin】2:快速上手Gin框架(模版、cookie、session)

【Gin】2:快速上手Gin框架(模版、cookie、session)

theaipower的博客 7187

Gin框架Cookie使用实例详解

在现代Web开发中,Cookie是一种非常重要的客户端存储机制,常用于会话管理、用户偏好设置等场景。本文将基于Gin框架的Cookie示例,深入讲解如何在Go语言Web应用中实现Cookie的设置、获取和验证。 ## 基本概念 ### 什么是Cookie Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器发起请求时被携带并发送到服务器上。通常用于实现会...

gitblog_00271的博客 423

【Gin框架入门到精通系列08】Gin中的Cookie和Session管理

本文详细介绍了Gin框架中的Cookie和Session管理机制,包括基础概念、代码实践、安全最佳实践以及常见应用场景,帮助您构建安全可靠的用户认证和状态管理系统。

GopherTribe的博客 1059

Golang gin Cookie的使用

Cookie 返回请求中提供的命名 cookie,如果未找到则返回 ErrNoCookie。并返回命名的 cookie 是未转义的。如果多个 cookie 与给定名称匹配,则只会返回一个 cookie。提供的 cookie 必须具有有效的名称。无效的 cookie 可能会被静默丢弃。httpOnly bool :是否允许别人通过js获取自己的cookie。maxAge int:cookie存活时间,单位为秒。path:cookie所在目录。name:cookie的名称。value:cookie的值。

小楼一夜听春雨,深巷明朝卖杏花 855

11-Gin 中的 Cookie --[Gin 框架入门精讲与实战案例]

Cookie 是一种存储在用户浏览器上的小型数据片段,通常用于保存会话信息、用户偏好设置等。当用户访问一个网站时,服务器可以发送一个 Cookie 给浏览器,浏览器会在本地保存这个 Cookie。之后每次用户再次访问同一网站时,浏览器都会将这些 Cookie 一并发送给服务器,从而让服务器能够识别出用户,并根据之前的交互提供个性化服务。

桃园码工的博客 1085

如何在Gin框架中正确删除Cookie:全面指南

在现代Web开发中,Cookie管理是构建用户友好应用的关键环节。Gin作为Go语言中最受欢迎的Web框架之一,提供了简洁而强大的Cookie处理机制。本文将深入探讨如何在Gin框架中正确删除Cookie,并介绍相关的实践技巧和常见问题解决方案。

Java程序员_编程开发学习笔记_网站安全运维教程_渗透技术教程 1041

一文了解Gin对Cookie的支持z

在本文中,我们深入探讨了Web应用程序在处理用户信息时所面临的挑战,特别是在HTTP协议作为无状态协议的背景下。我们从这一矛盾出发,介绍了解决方案中的Token机制,并引出了基于Cookie的实现方案。我们详细阐述了Cookie的规范,包括服务端如何发送Cookie以及客户端如何在请求中携带Cookie信息。我们进一步深入探讨了具体的实现方式,并介绍了Gin框架提供的API,这些API使得在服务端按照Cookie规范发送和解析Cookie变得更加容易。

chenjiazhanxiao的博客 697

gin设置并获取cookie

gin设置并获取cookie import ( "fmt" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.GET("/cookie", func(c *gin.Context) { cookie, err := c.Cookie("gin_cookie") if err != nil { cookie =

3575
上一篇: Gin(七):中间件的使用和定义
下一篇: Gin(九):生成restful接口
代码猎奇站
博客等级 码龄7年 39粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值