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.mzph.cn/news/772882.shtml

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

相关文章

centos创建svn库步骤

1.切换root用户 1、设置root用户的密码: sudo passwd root 2、切换到root用户权限 su 3、切换回个人用户权限 exit 2.用root用户执行yum install -y subversion 3.创建文件夹mkdir -p /data/svn/repository 4.创建SVN 版本库 5.输入命令: svnadmin creat…

IDEA连接github.com连接超时 Invalid authentication data. connect time out 的问题解决(亲测有效)

问题: IDEA连接github.com连接超时 Invalid authentication data. connect time out 解决方案(亲测有效): 修改host文件:打开 C:\Windows\System32\drivers\etc\hosts,文件末尾添加如下内容: …

OriginBot智能机器人开源套件

详情可参见:OriginBot智能机器人开源套件——支持ROS2/TogetherROS,算力强劲,配套古月居定制课程 (guyuehome.com) OriginBot智能机器人开源套件 最新消息:OriginBot V2.1.0版本正式发布,新增车牌识别,点击…

Vue3基础笔记(2)事件

一.事件处理 1.内联事件处理器 <button v-on:click"count">count1</button> 直接将事件以表达式的方式书写~ 每次单击可以完成自增1的操作~ 2.方法事件处理器 <button click"addcount(啦啦啦~)">count2</button> 如上&…

VMware下建立CentOS 7

1.点击新建虚拟机 2.下一步 3.选择号安装程序光盘映像文件位置&#xff0c;下一步 4.选择版本和操作系统然后下一步 5.编辑虚拟机名称并选择安装位置&#xff0c;然后下一步 6.设置最大磁盘大小&#xff0c;下一步 7.点击完成 8.点击编辑虚拟机设置 9.将此虚拟机内存设置为2G&a…

中间件学习--InfluxDB部署(docker)及springboot代码集成实例

一、需要了解的概念 1、时序数据 时序数据是以时间为维度的一组数据。如温度随着时间变化趋势图&#xff0c;CPU随着时间的使用占比图等等。通常使用曲线图、柱状图等形式去展现时序数据&#xff0c;也就是我们常常听到的“数据可视化”。 2、时序数据库 非关系型数据库&#…

爬虫实践(1)

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

小程序富文本图片宽度自适应

解决这个问题 创建一个util.js文件,图片的最大宽度设置为100%就行了 function formatRichText(html) {let newContent html.replace(/\<img/gi, <img style"max-width:100%;height:auto;display:block;");return newContent; }module.exports {formatRichT…

vue2创建项目(自用,初学)

vue2创建项目(自用&#xff0c;初学) 创建项目 1.在文件资源管理器中&#xff0c;选择想建立文件夹的目录&#xff0c;输入cmd指令 vue create 项目名2.初学练习选择最后一项 3.按空格进行勾选&#xff0c;回车下一步 4.因为是vue2&#xff0c;所以选2.x 5.选y 6.选Less 7.选…

canvas跟随鼠标画有透明度的椭圆边框

提示&#xff1a;canvas跟随鼠标画有透明度的椭圆边框 文章目录 前言一、跟随鼠标画有透明度的椭圆边框总结 前言 一、跟随鼠标画有透明度的椭圆边框 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

论文阅读-《Lite Pose: Efficient Architecture Design for 2D Human Pose Estimation》

摘要 这篇论文主要研究了2D人体姿态估计的高效架构设计。姿态估计在以人为中心的视觉应用中发挥着关键作用&#xff0c;但由于基于HRNet的先进姿态估计模型计算成本高昂&#xff08;每帧超过150 GMACs&#xff09;&#xff0c;难以在资源受限的边缘设备上部署。因此&#xff0…

大数据入门(一)

大数据主要要解决&#xff1a;海量数据的采集&#xff0c;存储&#xff0c;分析计算问题。 大数据的特点&#xff1a;大量&#xff08;数据量大&#xff09;&#xff0c;高速&#xff08;数据量的累积越来越快&#xff09;&#xff0c;多样&#xff08;结构化数据和非结构化数…

Intellij IDEA构建Android开发环境

Intellij IDEA创建项目时没有Android的选项 进设置&#xff08;Intellij IDEA - Settings - Plugins &#xff09; 再次创建项目可以看到Android的选项 解决Android导入项目时Gradle下载速度慢/超时/失败

HCIP —— 多生成树 (MSTP)

MSTP --- Multiple Spanning Tree Protocol --- 802.1s 在 MSTP 中 &#xff0c;提出了实例的概念&#xff0c;相当于可用让多个VLAN同时属于一个实例&#xff0c;然后只需要一个实例生成一棵树。 --- 一种 VLAN 分流的思想 实例ID &#xff1a;instance ID 由 12位 二进制…

windows安装tomcat

安装之前需要安装jdk1.8可以参考windows安装jdk1.8-CSDN博客 一、下载tomcat Apache Tomcat - Apache Tomcat 8 Software Downloads 解压到D盘的D:\Program Files\tomcat目录下 二、配置环境变量 电脑右键属性-高级系统设置-高级-环境变量 1、在系统变量配置CATALINA_HOME环…

掌握ES6的箭头函数:深入了解其实用性与规则

引言 ES6&#xff08;ECMAScript 2015&#xff09;引入了箭头函数&#xff0c;这是一种新的函数声明方式&#xff0c;它改变了我们编写JavaScript代码的方式。箭头函数提供了更简洁、更直观的语法&#xff0c;并且具有一些独特的特性和行为。本文将深入探讨箭头函数的规则、用…

【分布式】——降级熔断限流

降级&熔断&限流 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点…

mysqldump 备份与恢复

1. mysqldump 简介 mysqldump 是 MySQL 提供的一个命令行工具&#xff0c;用于备份 MySQL 数据库的结构和数据。它能够生成一个包含 SQL 语句的文本文件&#xff0c;以便在需要时恢复数据库。 2. mysqldump 备份数据库 要备份一个或多个数据库&#xff0c;可以使用 mysqldum…

uniApp中使用小程序XR-Frame创建3D场景(2)加载模型

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用&#xff0c;只完成了简单的环境搭建&#xff0c;这篇文章讲解如何加载3D模型。 1 加入模型加载标签 在XR-Frame框架中&#xff0c;加载资源都是在wxml文件的标签中实现的。下面是wxml中完整的代码 index.wxml &l…

PC电脑技巧[笔记本通过网线访问设备CMW500]

笔记本局域网访问设备 现在我有一台CMW500,我要用笔记本去访问它,但是我发现没有路由器就是不能够访问,通过网线连接设备就是ping不通: 这里设置TCP/IPv4的IP地址如下,这时候就可以pin通了: