热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

asp.netjavascrip获取session的值_GoWeb编程SecureCookie实现客户端Session管理

GoWeb编程--SecureCookie实现客户端Session管理在Web应用开发中Session是在用户和服务器之间进行交换的非持久化交互信息。当用户登录时,可

Go Web编程--SecureCOOKIE实现客户端Session管理

在Web应用开发中Session是在用户和服务器之间进行交换的非持久化交互信息。当用户登录时,可以在用户和服务器之间生成Session,然后来回交换数据,并在用户登出时销毁Session。gorilla/sessions软件包提供了易于使用的Go语言Session实现。该软件包提供了两种不同的实现。第一个是文件系统存储,它将每个会话存储在服务器的文件系统中。另一个是COOKIE存储,它使用我们上篇文章讲的SecureCOOKIE在客户端上存储会话。同时还提供了用户自定义Session存储实现的选项,我们可以根据应用的需求自己实现Session存储。因为我们的教程是学会使用为目的就不大费周章的去实现MySQL或者Redis版本的Session存储了,我们直接使用软件包提供的COOKIE实现来完成本节的Session相关内容。

Go Web 编程系列的每篇文章的源代码都打了对应版本的软件包,供大家参考。公众号中回复gohttp09获取本文源代码

使用COOKIE存储用户Session的优缺点

客户端使用COOKIE管理用户Session较之在服务器进行用户的Session管理会有一些优势。客户端Session增加了应用程序的可伸缩性,因为所有的会话数据都存储在用户端,因此可以将用户的请求平衡到不同的远端服务器,也不必在服务器端对所有用户的会话进行统一管理,所以使用COOKIE存储用户Session会更简单一些。

当然有优势就必定有劣势,客户端COOKIE的整体大小是有限制的。目前,Google Chrome浏览器将COOKIE限制为4096个字节。

客户端会话还意味着无法终止会话,从而导致注销不完整。如果用户在退出前保存了COOKIE中的会话信息,则他们可以使用该会话信息创建一个新的COOKIE,然后继续使用该应用程序,为了最大程度地降低安全风险,我们可以将会话COOKIE设置为在合理的时间内过期,使用加密后的ScureCOOKIE存储数据,同时还要避免在其中存储敏感信息(即使是服务端管理Session也不应该存储类似密码这种敏感信息)。

总之在考虑使用客户端还是服务端存储用户Session时一定要根据应用的使用场景来选择,这一点很重要。

安装gorilla/sessions

在开始编码前先来安装一下gorilla/sessions软件包,

$ go get github.com/gorilla/sessions

并简单看一下软件包功能特性的介绍

  • 方便地设置签名(也可以选择加密)的COOKIE。
  • 自带将会话存储在COOKIE或服务端文件系统中的SessionStore实现。
  • 支持Flash消息:读取即销毁的会话数据。
  • 支持方便地切换会话数据的持久化方式。
  • 为不同的Session存储提供统一的接口和基础设施。

演示用户Session设计实现

我们今天的示例代码是用gorilla/sessions提供的COOKIESessionStore实现一个简单的系统登录功能。

我们会定义如下几个路由:

  • /user/login 用户登录验证,验证成功后在用户Session数据中标记用户是已验证的。
  • /user/logout 用户登出,会在Session中标记用户是未认证的。
  • /user/secret 通过用户Session判断用户是否已认证,未认证返回403 Forbidden错误。

为了达到演示目的的同时减少文章中出现过多代码,我们不会做前端页面,通过命令行cURL直接请求上面几个URL验证我们的系统登录功能。

初始化工作

我们现在项目的handler目录下新建一个user子目录,用于存放使用到用户Session的处理程序

...handler/└── user/ └── init.go └── login.go └── logout.go └── secret.go...main.go

其下的四个分别是包的初始化程序init.go以及存放上面说的三个路由处理程序的.go源文件。

初始化Session存储

我们把Session存储的初始化工作放在user包的init函数中,这样首次导入user包时即可完成相关的初始化工作。

package userimport "github.com/gorilla/sessions"const (//64位COOKIEStoreAuthKey = "..."//AES encrypt key必须是16或者32位COOKIEStoreEncryptKey = "...")var sessionStore *sessions.COOKIEStorefunc init () {sessionStore = sessions.NewCOOKIEStore([]byte(COOKIEStoreAuthKey),[]byte(COOKIEStoreEncryptKey),)sessionStore.Options = &sessions.Options{HttpOnly: true,MaxAge: 60 * 15,}}

实现登录验证

// login.govar sessionCOOKIEName = "user-session"func Login(w http.ResponseWriter, r *http.Request) {session, err := sessionStore.Get(r, sessionCOOKIEName)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}// 登录验证name := r.FormValue("name")pass := r.FormValue("password")_, err = logic.AuthenticateUser(name, pass)if err != nil {http.Error(w, err.Error(), http.StatusUnauthorized)return}// 在session中标记用户已经通过登录验证session.Values["authenticated"] = trueerr = session.Save(r, w)fmt.Fprintln(w, "登录成功!", err)}

  • 我们将浏览器COOKIE中存储用户Session的COOKIE-Name设置成了user-session。
  • 登录验证就是简单的用户名和密码查找匹配的用户,在之前的文章应用数据库和应用 ORM两篇文章中有在MySQL数据库中创建users表,并介绍了怎么使用ORM操作数据库,没有看过的同学可以回看一下。
  • 登录验证成功后在Session的authenticated中标记了用户已通过认证。session.Values是类型map[interface{}]interface{}的别名,所以可以往其中存储任意类型的数据。

实现登出

登出我们这里就是简单的将Session中authenticated的值设置成了false.

//logout.gofunc Logout(w http.ResponseWriter, r *http.Request) { session, _ := sessionStore.Get(r, sessionCOOKIEName) session.Values["authenticated"] = false session.Save(r, w)}

使用Session认证用户

//secret.gofunc Secret(w http.ResponseWriter, r *http.Request) { session, _ := sessionStore.Get(r, sessionCOOKIEName) if auth, ok := session.Values["authenticated"].(bool); !ok || !auth { http.Error(w, "Forbidden", http.StatusForbidden) return } fmt.Fprintln(w, "这里还是空空如也!")}

  • 使用Session中存储的数据值都是接口类型的,所以使用时要先对其进行类型断言session.Values["authenticated"].(bool)
  • 如果authenticated的值不为true或者是从Session中获取不到对应的值,这里直接返回HTTP 403 Forbidden错误。

注册路由

// router.gofunc RegisterRoutes(r *mux.Router) { ... userRouter := r.PathPrefix("/user").Subrouter() userRouter.HandleFunc("/login", user.Login).Methods("POST") userRouter.HandleFunc("/secret", user.Secret) userRouter.HandleFunc("/logout", user.Logout) ...}

验证已实现的Session管理功能

编写完上面的Session管理的功能后,重启服务器,然后使用cURL分别请求URL验证一下效果。

curl -XPOST -d 'name=Klein&password=123' -c - http://localhost:8000/user/login

-c选项表示将COOKIE写入到后面的文件中,完整格式是-c -,短横线后不带文件名表示把COOKIE写入到标准输出中。

我们可以在下图里看到,COOKIE中的user-session存储的就是加密后的Session数据了

f8dcb8135a1649e797afe4bc4ed2f12f

如果请求中不携带这个COOKIE访问/user/secret会直接返回HTTP 403错误

a0fc5a7704b74d0595ff2e558b6754e8

那么接下来在使用cURL请求/user/secret时带上上面返回的COOKIE值,看看请求是否能成功

curl --COOKIE "user-session=MTU4m..." http://localhost:8000/user/secret

b3d840239d624f2ba3d54082f3ac3851

COOKIE加密后的值太长了,搞得字儿好小,cURL执行的结果显示服务器成功地响应了我们的请求。你们试验的时候换成自己生成的COOKIE值请求就可以啦。

你们实践时也可以用PostMan代替cURL试验,不过感觉PostMan的返回不如cURL来的明显。



推荐阅读
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 本文介绍了 Vue 开发的入门指南,重点讲解了开发环境的配置与项目的基本搭建。推荐使用 WebStorm 作为 IDE,其下载地址为 。安装时请选择适合您操作系统的版本,并通过 获取激活码。WebStorm 是前端开发者的理想选择,提供了丰富的功能和强大的代码编辑能力。 ... [详细]
  • 精选在线API编辑工具推荐
    本文将介绍几款优秀的在线API编辑工具,包括它们的功能特点和使用方法,帮助开发者提高工作效率。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • Webdriver中元素定位的多种技术与策略
    在Webdriver中,元素定位是自动化测试的关键环节。本文详细介绍了8种常用的元素定位技术与策略,包括ID、名称、标签名、类名、链接文本、部分链接文本、XPath和CSS选择器。每种方法都有其独特的优势和适用场景,通过合理选择和组合使用,可以显著提高测试脚本的稳定性和效率。此外,文章还探讨了在复杂页面结构中如何灵活运用这些定位技术,以应对各种挑战。 ... [详细]
  • 在Eclipse中提升开发效率,推荐使用Google V8插件以增强Node.js的调试体验。安装方法有两种:一是通过Eclipse Marketplace搜索并安装;二是通过“Help”菜单中的“Install New Software”,在名称栏输入“googleV8”。此插件能够显著改善调试过程中的性能和响应速度,提高开发者的生产力。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
author-avatar
rorather_0979107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有