gin语言基础学习--会话控制(下)

练习

  • 模拟实现权限验证中间件

    • 有2个路由,/cookie和/home
    • /cookie用于设置cookie
    • home是访问查看信息的请求
    • 在请求home之前,先跑中间件代码,检验是否存在cookie
  • 访问home,会显示错误,因为权限校验未通过

package mainimport ("net/http""github.com/gin-gonic/gin"
)func AuthMiddleWare() gin.HandlerFunc {return func(ctx *gin.Context) {// 获取客户端cookie并校验if cookie, err := ctx.Cookie("aaa"); err == nil {if cookie == "key" {ctx.Next()return}}//返回错误ctx.JSON(http.StatusUnauthorized, gin.H{"err": "error"})// 若验证不通过,不再调用后续的函数处理ctx.Abort()return}
}func main() {r := gin.Default()// 服务端给客户端cookier.GET("cookie", func(ctx *gin.Context) {// 设置ccokiectx.SetCookie("aaa", "key", 60, "/", "localhost", false, true)ctx.String(200, "success!")})r.GET("home", AuthMiddleWare(), func(ctx *gin.Context) {ctx.JSON(200, gin.H{"data": "this is an noisy room"})})r.Run()
}

 cookie缺点

  • 不安全,明文
  • 增加带宽消耗
  • 可以被禁用
  • cookie有限

 Session

gorilla/sessions为自定义session后端提供cookie和文件系统session以及基础结构。

主要功能是:

  • 简单的API:将其用作设置签名(以及可选的加密)cookie的简便方法。
  • 内置的后端可将session存储在cookie或文件系统中。
  • Flash消息:一直持续读取的session值。
  • 切换session持久性(又称“记住我”)和设置其他属性的便捷方法。
  • 旋转身份验证和加密密钥的机制。
  • 每个请求有多个session,即使使用不同的后端也是如此。
  • 自定义session后端的接口和基础结构:可以使用通用API检索并批量保存来自不同商店的session。
package mainimport ("fmt""net/http""github.com/gorilla/sessions"
)// 初始化一个cookie存储对象
// something-very-secret应该是一个你自己的密匙,只要不被别人知道就行
var store = sessions.NewCookieStore([]byte("secret"))func main() {// 服务端给客户端cookiehttp.HandleFunc("/save", SaveSession)http.HandleFunc("/get", GetSession)err := http.ListenAndServe(":8080", nil)if err != nil {fmt.Println("server fail:", err)return}}func SaveSession(w http.ResponseWriter, r *http.Request) {// Get a session. We're ignoring the error resulted from decoding an// existing session: Get() always returns a session, even if empty.// 获取一个session对象,session-name是session的名字session, err := store.Get(r, "session-name")if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}// 在session中存储值session.Values["foo"] = "bar"session.Values[1] = 2// 保存更改session.Save(r, w)
}
func GetSession(w http.ResponseWriter, r *http.Request) {session, err := store.Get(r, "session-name")if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)http.Error(w, err.Error(), http.StatusInternalServerError)return}foo := session.Values["foo"]fmt.Println(foo)}
func DelSession(w http.ResponseWriter, r *http.Request) {// 删除session的值// 将session的最大存储时间设置为小于零的数值即为删除session, err := store.Get(r, "session-name")if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}session.Options.MaxAge = -1session.Save(r, w)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/287663.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Laravel扩展包的开发

扩展包的开发 1. 创建一个新项目,初始化扩展包配置 首先创建一个全新的Laravel项目: composer create-project --prefer-dist laravel/laravel laravelPkg 接下来,在项目中创建目录package/{your_name}/{your_package_name} mkdir -p pa…

【源码】I.MX6ULL移植OpenCV

编译完成的源码: git clone https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.下载源码放在自己的opecv源码目录下 2.QTOpenCV工程代码放置的位置 3.更改.pro工程文件的opencv地址 4.使用命令行编译 前提是自己环境中已经配置好arm-qt的交叉编译…

C语言_第一轮笔记_指针

8.1 密码开锁 地址和指针 一般以变量所在的内存单元的第一个字节的地址作为他的地址NULL的值为0,代表空指针 指针变量的定义 类型名 *指针变量名类型名指定指针变量所指向变量的类型指针声明符*在定义指针变量时被使用,说明被定义的那个变量是指针指针变…

unity学习(68)——相机/模型的旋转/位置计算

这个比想象中要难,而且需要自己写。 1.相机可以转xy两个位置,可以点头和转圈。注意这里有一个if判断(后面返回来发现了这些问题) 2.角色不能点头,只能转圈。 难得是移动方向,因为移动方向(位置)和转向是相…

爬虫实践(1)

这一篇只提登录模拟,主要介绍chrome开发者窗口的使用,实际上相关接口调用都是用到cookie,需要再加一篇从token到cookie,以保证实践的完整性 以migu登录为例,分析其登录过程,之后可以使用任意语言模拟登录&…

蓝桥杯刷题(十四)

1.小平方 代码 n int(input()) count0 def f(x)->bool: # 判断条件return True if x**2%n<n/2 else False for i in range(1,n): # 遍历[1,n-1]&#xff0c;符合题意计数加一if f(i):count1 print(count)2.3的倍数 代码 a int(input()) b int(input()) c int(input…

springboot基本使用七(静态资源映射)

第一种方式通过配置文件设置&#xff1a; 实现方式&#xff1a;springboot基本使用二&#xff08;resources目录简单介绍&#xff09;-CSDN博客文章浏览阅读907次&#xff0c;点赞25次&#xff0c;收藏22次。再次访问&#xff1a;location:8099/index.html。两个静态资源目录中…

【No.20】蓝桥杯简单数论下|寻找整数|素数的判断|笨小猴|最大最小公倍数|素数筛|埃氏筛|欧氏线性筛|质数|分解质因子(C++)

寻找整数 【题目描述】 有一个不超过 1 0 1 7 10^17 1017的正整数n&#xff0c;知道这个数除以2至49后的余数如下表所示&#xff0c;求这个正整数最小是多少 解法一&#xff1a;模拟 暴力法&#xff1a;一个个检验 1 … 1 0 17 1\dots 10^{17} 1…1017的每个数 由于这个数n…

深度学习pytorch——减少过拟合的几种方法(持续更新)

1、增加数据集 2、正则化(Regularization) 正则化&#xff1a;得到一个更加简单的模型的方法。 以一个多项式为例&#xff1a; 随着最高次的增加&#xff0c;会得到一个更加复杂模型&#xff0c;模型越复杂就会更好的拟合输入数据的模型&#xff08;图-1&#xff09;&#…

2024品牌私域运营:「去中心化」正在成为企业决胜关键

越来越多的品牌选择以DTC模式与消费者互动和销售。通过与消费者建立紧密联系&#xff0c;不仅可提供更具成本效益的规模扩张方式&#xff0c;还能控制品牌体验、获取宝贵的第一方数据并提升盈利能力。许多企业采取的DTC私域策略以交易为中心的方法往往导致了成本上升和运营复杂…

Day18:LeedCode 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 思路:出该二叉树的 最底层 最左边 节点的值找出深度最大的第一个结点(左结点先遍历) 方法一…

发送请求- header配置

请求头里是客户端的要求&#xff0c;把你的诉求告诉服务端&#xff0c;服务端按照你的要求返回数据 &#xff0c; 请求header需要严格全配置&#xff0c;把请求header全部传入&#xff0c;不能频繁访问&#xff0c;让后端知道它是正常请求 一般只配置User-Agent和Content Typ…

模板方法模式(继承的优雅使用)

目录 前言 UML plantuml 类图 实战代码 AbstractRoutingDataSource DynamicDataSource DynamicDataSourceContextHolder 前言 在设计类时&#xff0c;一般优先考虑使用组合来替代继承&#xff0c;能够让程序更加的灵活&#xff0c;但这并不意味着要完全抛弃掉继承。 …

2024/3/26 C++作业

定义一个矩形类&#xff08;Rectangle&#xff09;&#xff0c;包含私有成员&#xff1a;长(length)、宽&#xff08;width&#xff09;, 定义成员函数&#xff1a; 设置长度&#xff1a;void set_l(int l) 设置宽度&#xff1a;void set_w(int w) 获取长度&#xff1a;int…

Python批量提取图像灰度共生矩阵(GLCM)、支持批量处理、任意图像格式

目录 一、介绍 二、实现 1、特征计算 2、批量处理 3、结果 一、介绍 灰度共生矩阵(Grey Level Co-occurrence Matrix)也叫做空间灰度级依赖矩阵(SGLDM),它是一种基于统计的纹理特征提取的方法。 一般包括四个方向&#xff1a; (a,b)(1,0)&#xff0c;像素对是水平的&am…

基于javaweb(springboot+mybatis)生活美食分享平台管理系统设计和实现以及文档报告

基于javaweb(springbootmybatis)生活美食分享平台管理系统设计和实现以及文档报告 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 …

在django中使用kindeditor出现转圈问题

在django中使用kindeditor出现转圈问题 【一】基础检查 【1】前端检查 确保修改了uploadJson的默认地址 该地址需要在路由层有映射关系 确认有加载官方文件 kindeditor-all-min.js确保有传递csrfmiddlewaretoken 或者后端关闭了csrf验证 <textarea name"content&qu…

AXI-Stream——草稿版

参考自哔站&#xff1a;FPGA IP之AXI4-Lite AXI4-Stream_哔哩哔哩_bilibili 信号 传输层级从小到大 包(----------transfer--transfer--------)------delay--------包(----------transfer--transfer--------) TKEEP和TSTRB共同决定了是哪种数据流

Github简单入门教程

文章目录 使用前提查看项目内容查看项目介绍打包下载项目查看项目作者项目搜索复制项目分支项目创建向项目中添加文件对项目进行评论 使用前提 想要使用Github&#xff0c;首先需要学会科学上网&#xff0c;不然用国内的网在正规情况下是无法访问Github滴~ 查看项目内容 打开…

鸿蒙Harmony应用开发—ArkTS-ForEach:循环渲染

ForEach基于数组类型数据执行循环渲染。 说明&#xff1a; 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 接口描述 ForEach(arr: Array,itemGenerator: (item: Array, index?: number) > void,keyGenerator?: (item: Array, index?: number): string …