建设银行 北京招聘网站学校如何建设网站

news/2025/10/7 8:58:48/文章来源:
建设银行 北京招聘网站,学校如何建设网站,个人网页制作模板三张,网站制作案例1. 引言 本文将从Web应用程序处理请求时需要用户信息#xff0c;同时HTTP又是无状态协议这个矛盾点出发。从该问题出发#xff0c;简单描述了解决该问题的Token 机制#xff0c;进而引出Cookie的实现方案。 基于此我们将详细描述Cookie的规范#xff0c;然后详细描述具体…1. 引言 本文将从Web应用程序处理请求时需要用户信息同时HTTP又是无状态协议这个矛盾点出发。从该问题出发简单描述了解决该问题的Token 机制进而引出Cookie的实现方案。 基于此我们将详细描述Cookie的规范然后详细描述具体的实现方式进一步描述Gin 框架对Cookie 操作提供的API最终提供了一个详细的代码实现。 我们还将详细描述Gin 框架提供API 的实现原理帮助用户更好得使用这两个API。 2. 问题引入 在 如何使用Gin搭建一个Go Web应用程序 一文中我们已经了解了如何使用Gin 搭建一个简单的Web应用程序。然而在现实的Web应用程序中大部分功能都是需要用户的身份信息才能处理。举例来说在一个视频网站查看用户最近观看记录如果缺少用户身份信息此时将无法对请求进行处理。 但是HTTP协议的设计是无状态的也就是每次请求都是独立的。基于此应该有一套机制能够在用户身份认证成功后给用户分配一个Token后续用户在每次请求时都携带上该Token使得服务器能够从请求中获取用户信息解决HTTP无状态问题。大概流程如下: 上面流程中需要服务端按照某个协议向客户端返回Token客户端通过该协议成功解析出服务端返回的Token然后在每次请求中携带该Token。然后服务器端再根据协议从中解析出Token 信息获取请求用户信息。 当前常用的有Cookie JwtOAuth2.0 等标准其各有优缺点。其中Cookie 是一种存储在客户端浏览器中的数据。服务端可以通过设置HTTP响应头将Token 存储在Cookie当中并在后续请求中从Cookie 中读取Token。而JWT 则是一种基于JSON格式的安全令牌可用于在客户端和服务端之间传递信息。 之前我们在 一文读懂Cookie 中已经了解Cookie的相关内容。基于此我们这次使用Cookie 来实现上述所说的流程按照Cookie的规范来实现Token的返回和请求中Token 的解析。 3. 实现 3.1 Cookie规范说明 这里我们对HTTP协议中的Cookie 规范再补充一下这里分为两部分第一部分是服务端如何向客户端发送 Cookie 第二部分是客户端向服务端发送请求时如何携带Cookie 信息。 对于服务端向客户端发送Cookie的手段HTTP协议存在一个Set-Cookie 的头部字段服务器可以通过Set-Cookie 头部字段将Cookie发送给客户端。例如下面这个例子: Set-Cookie: usernameabc; expiresWed, 09 Jun 2023 10:18:14 GMT; path/ 在这个例子中服务器设置了一个名为username的Cookie它的值是abc过期时间是2023年6月9日路径为/ 。浏览器在接收到该Cookie 时便将其保存起来。 客户端请求时携带Cookie的方式则是通过HTTP协议中的Cookie头部字段客户端可以通过该头部字段携带信息给服务器端比如下面这个例子: Cookie: sessionid1234 在这个例子中HTTP请求中携带了一个name 为sessionid value 为 1234 的 Cookie。当服务器端接收到该HTTP 请求后从中解析出Cookie的信息然后基于此实现后续的流程。 3.2 实现说明 回看上述流程主要分为两个大部分: 客户端和服务器端。在客户端部分关键任务包括保存浏览器返回的Cookie信息以及在请求时携带Cookie 信息给服务器。对于服务器端则是在通过身份校验之后能够按照规范客户端返回Cookie并在接收到请求时能够正确解析出请求中的 Cookie 信息识别出用户信息。 对于客户端部分在浏览器接收到HTTP响应时如果响应体中有Set-Cookie 头部字段浏览器会自动保存Cookie信息客户端发起请求时需要将 Cookie 信息传递给服务器。此时浏览器会自动携带通过校验的Cookie。如果通过校验此时会在HTTP请求头中携带Cookie信息给服务端下面是一个大概的校验流程: 在整个流程中客户端保存Token信息和在请求时携带Token信息这两部分工作浏览器已经帮我们实现了。剩下的工作集中在服务端的主要涉及按照Cookie的规范给客户端返回用户标识并在接收到客户端请求时从HTTP请求中读取Cookie以获取到用户的信息。与Cookie相关的详细内容可以参考文章一文读懂Cookie。 因此下面我们需要做的两件事情其一服务器需要按照Cookie的规范往客户端发送Cookie的内容其次服务器在处理请求时需要从HTTP请求头中读取出Cookie的信息成功识别用户身份。 Gin 框架中提供了一些API能够帮助我们在服务端按照Cookie规范给客户端发送Cookie 信息同时也有API 能够帮助我们解析Cookie 的信息。下面我们先来了解相关的API然后再基于这些API 搭建一个能够自动识别用户信息的 Web 应用程序。 3.3 API说明 3.3.1 SetCookie gin.Context 对象中的 SetCookie 方法用于向客户端返回响应的同时在Set-Cookie头部携带Cookie 信息。下面是该方法的详细说明 func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool) namecookie 的名称必须。valuecookie 的值必须。maxAgecookie 的过期时间以秒为单位。如果为负数则表示会话 cookie在浏览器关闭之后删除如果为零则表示立即删除 cookie可选默认值为-1。pathcookie 的路径。如果为空字符串则使用当前请求的 URI 路径作为默认值可选默认值为空字符串。domaincookie 的域名。如果为空字符串则不设置域名可选默认值为空字符串。secure指定是否仅通过 HTTPS 连接发送 cookie。如果为 true则仅通过 HTTPS 连接发送 cookie否则使用 HTTP 或 HTTPS 连接都可以发送 cookie可选默认值为 false。httpOnly指定 cookie 是否可通过 JavaScript 访问。如果为 true则无法通过 JavaScript 访问 cookie否则可以通过 JavaScript 访问 cookie可选默认值为 true。 在处理函数中通过调用SetCookie 方法便可以向客户端发送一个HTTP cookie。这里举一个代码示例来帮助读者更好得理解该API下面举一个代码示例如下: func main() {router : gin.Default()router.GET(/set-cookie, func(c *gin.Context) {c.SetCookie(user, john, 3600, /, , false, true)c.String(http.StatusOK, cookie set successfully)})router.Run(:8080) } 在这个示例中使用 SetCookie 方法设置一个名为user的 cookie。这个 cookie 的值是john在 1 小时后过期。该代码还设置了路径为“/”以及HttpOnly属性为true。 下面启动该服务器客户端向服务端发送请求请求路径为/set-cookie上面的处理函数将会被执行然后我们来看其响应内容: # 1. 发送请求 curl -i http://localhost:8080/set-cookie # 2. 返回响应 HTTP/1.1 200 OK Content-Type: text/plain; charsetutf-8 Set-Cookie: userjohn; Path/; Max-Age3600; HttpOnly Date: Sun, 20 Aug 2023 07:39:15 GMT Content-Length: 23cookie set successfully 查看上面第6行可以看到我们通过SetCookie方法成功设置了一个Cookie然后以在HTTP头部的形式返回。 3.1.2 Cookie方法 往客户端返回Cookie后浏览器会将Cookie保存起来然后在下次请求时将Cookie跟随请求一起发送给服务器端。 在HTTP无状态协议的情况下我们使用Cookie 来识别用户信息此时服务器端需要正确解析出HTTP 头部中Cookie的信息Gin 框架中的gin.Context 提供了Cookie方法方便我们获取到Cookie的信息。下面是该方法的定义说明: func (c *Context) Cookie(name string) (string, error) 使用Cookie方法可以获取指定名称的Cookie值如果不存在指定名字的Cookie此时将会返回错误。下面给一个简单示例代码的说明: func main() {router : gin.Default()// 定义路由router.GET(/cookie, func(c *gin.Context) {// 获取名为 username 的 cookiecookie, err : c.Cookie(username)if err ! nil {// 如果 cookie 不存在则返回错误信息c.JSON(http.StatusBadRequest, gin.H{error: Bad request})return}// 在响应中返回 cookie 值c.JSON(http.StatusOK, gin.H{username: cookie})})router.Run(:8080) } 在上述示例中我们定义了一个 /cookie 路由使用 c.Cookie(username) 方法来获取名为 username 的 Cookie 值。如果 Cookie 不存在则返回一个错误响应。否则我们将在响应中返回 Cookie 的值。 下面我们通过curl 命令来对/cookie 请求通过 -b 标识来携带cookie 值: # -v, --verbose 这个参数会打开curl的详细模式输出一些额外的信息包括HTTP请求和响应头信息。 curl -b -v -b usernamehello cookie; http://localhost:8080/cookie 下面我们来看具体的请求体和响应体的内容: GET /cookie HTTP/1.1 Host: localhost:8080 User-Agent: curl/7.79.1 Accept: */* Cookie: usernamehello cookie; 可以看到我们请求体携带了Cookie 字段Cookie 的名称为 username我们前面服务器端便是尝试获取名为 username 的 Cookie下面我们看请求的响应体看是否成功解析了HTTP 请求 Cookie的内容: HTTP/1.1 200 OK Content-Type: application/json; charsetutf-8 Date: Sun, 20 Aug 2023 08:12:45 GMT Content-Length: 27{username:hello cookie} 可以看到服务端程序通过Cookie方法成功解析了HTTP请求头部中Cookie字段的值然后将解析的结果正常返回客户端。 3.4 代码实现 下面我们来搭建一个基于Cookie 实现用户身份验证的Web 应用程序首先需要一个登录页面用于验证用户身份信息验证通过后我们将通过Cookie 给客户端返回一个 Token。 同时我们还需要创建一个页面需要验证用户身份信息在验证过程中我们会检查用户请求中是否携带Cookie同时Cookie 中携带的数据是否正确基于此实现用户身份的验证。下面是一个简单代码的示例: func main() {route : gin.Default()route.GET(/login, func(c *gin.Context) {// HTTP 响应中携带 Cookie// Set cookie {label: ok }, maxAge 30 seconds.c.SetCookie(label, ok, 30, /, localhost, false, true)c.String(200, Login success!)})route.GET(/home, func(c *gin.Context) {// 获取 name label 的 Cookie 的 valueif cookie, err : c.Cookie(label); err nil {// 判断 Cookie的value 是否满足预期if cookie ok {c.JSON(200, gin.H{data: Your home page})}} else {c.JSON(http.StatusForbidden, gin.H{error: Forbidden with no cookie})}})route.Run(:8080) } 首先是一个/login 请求路由通过SetCookie 方法给客户端返回Cookie基于此返回用户Token。 然后/home 路由的处理则是通过gin.Context中Cookie 方法获取到HTTP请求头部中Cookie的信息 然后验证Cookie 中的value是否满足预期。 这个是一个简单的代码示例比如用户身份认证机制等则需要自行完善这里不再完整展示。 4. 原理 下面将简单描述gin.Context 对象中SetCookie 方法和Cookie方法的实现原理帮助读者更好使用这两个API。 4.1 SetCookie方法 SetCookie 方法的实现原理如下首先SetCookie 方法会创建一个http.Cookie对象并设置其名称、值、路径、域名、过期时间等属性。例如以下代码创建了一个名为sessionid的Cookie: cookie : http.Cookie{Name: sessionid,Value: 1234,Expires: time.Now().Add(24 * time.Hour),Path: /,Domain: ,Secure: false,HttpOnly:true, } 接下来将上述Cookie对象转换为字符串格式并设置到HTTP响应头的Set-Cookie字段中。代码实现如下 func SetCookie(w ResponseWriter, cookie *Cookie) {if v : cookie.String(); v ! {w.Header().Add(Set-Cookie, v)} } 这里第三行将Cookie 存储到Header 对象当中Header 是专门用于存储HTTP响应头部的信息。调用Add 方法时会根据指定的Key在 Header 对象中查找相应的值列表。如果这个键不存在则会在 Header 对象中创建一个新的值列表否则会在已有的值列表末尾添加新的值大概流程如下: 在返回HTTP响应时会遍历Header 对象填充HTTP响应头部信息然后返回给客户端比如上面Header 生成的HTTP响应头部如下: Set-Cookie: v1 Set-Cookie: v2 Agent: Windows SetCookie 方法便是通过上述所说流程将Cookie 的信息设置到HTTP响应体头部当中去然后返回给客户端。 4.2 Cookie方法 在调用 Cookie() 方法时系统会首先检查请求头部中是否包含名为 Cookie的字段。如果该字段不存在则返回空字符串。 如果请求头部中包含 Cookie 字段同时Cookie 的name 为调用Cookie() 方法指定的值则系统会解析该字段并将其转换为一个 http.Cookie 对象。这个对象包含了所有的 Cookie 属性例如名称、值、路径、过期时间、域名等等。最后返回转换后的http.Cookie 对象中值大概流程如下: 总的来说Cookie() 方法的实现原理比较简单它只是通过查找 HTTP 请求头部中的 Cookie 信息并将其转换为 http.Cookie 对象来获取请求中特定 Cookie 值。 5. 总结 在本文中我们深入探讨了Web应用程序在处理用户信息时所面临的挑战特别是在HTTP协议作为无状态协议的背景下。我们从这一矛盾出发介绍了解决方案中的Token机制并引出了基于Cookie的实现方案。 我们详细阐述了Cookie的规范包括服务端如何发送Cookie以及客户端如何在请求中携带Cookie信息。 我们进一步深入探讨了具体的实现方式并介绍了Gin框架提供的API这些API使得在服务端按照Cookie规范发送和解析Cookie变得更加容易。通过一个实际的代码示例我们演示了如何使用这些API来构建一个基于Cookie实现用户身份验证的Web应用程序。 在探讨API的使用之余我们也深入剖析了Gin框架提供的API的实现原理为读者提供了更深层次的理解。 基于此完成了对Gin中Cookie支持的介绍希望对你有所帮助。

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

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

相关文章

广州专业的网站建设公司哪家好黄骅在线

刚刚接触Mendix低代码两周,花了一周在b站看初级视频然后考完初级,第二周开始做个列表查询感觉照葫芦画瓢没啥难度。但最近要求写个导出列表数据,在mendix社区翻了翻,这个功能算是常见的。找了mendix官方提供的Docs磕磕盼盼才实现了…

busybox 没有 clear 命令吗

是的,BusyBox 默认不包含 clear 命令。 替代方案 1. 使用 echo 命令bash 复制下载echo -e "\033c"或者bash 复制下载printf "\033c"2. 使用快捷键 在终端中按 Ctrl + L 也可以清屏 3. 创建别名…

实用指南:Hive SQL 中 BY 系列关键字全解析:从排序、分发到分组的核心用法

实用指南:Hive SQL 中 BY 系列关键字全解析:从排序、分发到分组的核心用法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fami…

高阶数据结构——并查集 - 详解

高阶数据结构——并查集 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

网站建设方案范文网站建设详细报价

继续炒股。第一题是买卖股票的最佳时机IIIhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/,与上题不同的是,本题要求买卖的次数要限制在2次以内。对上题的dp数组,显然要增加它的状态以适应题目要求。对于遍历…

经过基于流视频预测的可泛化双手运行基础策略

经过基于流视频预测的可泛化双手运行基础策略pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

公司网站打不开微博+wordpress

1. 不说负能量的话,会引发自己的负能量 在日常生活中,我们的语言不仅能够影响他人,更能影响我们自己。负能量的话语,如抱怨、批评或消极的自我对话,会潜移默化地影响我们的心态和情绪。为了维持积极的心态&#xff0c…

进程——环境变量及软件地址空间

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

软件开发与网站开发的区别网站落地页如何做

/*java中的集合类 实现了 Connection接口ArrayList这个集合类 java.util.*这个包的类toArray()方法可以返回一个 Object类型的对象数组我们部队 ArratList进行泛型规范那么就会警告 但是还是可以运行的这是因为JDK1.5中引进了泛型,但是你的ArrayList却没有采用&a…

高唐做网站建设的公司小皮怎么创建网站

目录 题目答案运行结果 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组…

自己可做以做网站吗天元建设集团有限公司商票兑付情况

520这一天,也是网络情人节。就在那天,如果没有女朋友的自己,如何假装自己是有朋友的!如何在朋友圈“秀恩爱。女生版:image很有感觉有木有~~男生版:imageimage其实这些都是小意思啦~~这些都是假装自己有女朋…

【HarmonyOS 5】鸿蒙Taro跨端框架 - 教程

【HarmonyOS 5】鸿蒙Taro跨端框架 - 教程2025-10-07 08:31 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…

遵义祥云平台网站建设中国企业500强排名2021

《童年》是高尔基自传体小说三部曲中的第一部,讲述的是高尔基幼年丧父、母亲改嫁,他跟随日渐破落的小染坊主外公以及外婆生活的童年经历。小说通过一个儿童天真无邪的眼光,向读者生动地展示了19世纪中叶俄罗斯社会底层人民的生活状态&#xf…

学习unigui【37】nginx的反向代理 ,程序中的重新定向

学习unigui【37】nginx的反向代理 ,程序中的重新定向默认port:9077 希望IP:81后访问9077。于是就采用nginx。问题当点击下载文件或浏览文件等时,怎么知道用户是通过81口访问的? UniGUI 没有暴露 RequestHeader(s),…

php空间放多个网站做好的网站如何上线

如果聊起国内的智能机市场,我想大多数人的印象就是疯狂内卷。卷影像、卷屏幕、卷快充、卷性能……客观地说,国内的3C产品还是很有质价比的。不过在没有如此内卷的日本市场,各种小屏手机仍旧是主流。 除了苹果外,日本本土品牌的夏普…

我和宠物做朋友教案小精灵网站iis怎么使用来建设一个网站

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 开头先分享个有趣的哈哈哈 承包了我一天的快乐秧 点击此处…

wordpress建的大型网站吗云适配 网站

刷题 309.最佳买卖股票时机含冷冻期 题目链接 | 文章讲解 | 视频讲解 题目:给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多…

wordpress手机网站个人网站建设收费标准

一、前言 前面有相关系列文章介绍了ES的基本概念和各种版本SDK的使用,ES现在已升级到8.5版本,有些概念和SDK用法都有很大变化,后续ES相关的文章会以8.3版本为基准介绍一些实际中应用需要掌握的概念以及一些比较实际的例子。 二、映射 ES环…

北京SEO网站优化公司郑州网站推广公司

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

单页面推广网站模版汉语网站建设心得

JL-8集成电路电流继电器 系列型号 JL-8A/11集成电路电流继电器;JL-8B/11集成电路电流继电器; JL-8A/12集成电路电流继电器;JL-8B/12集成电路电流继电器; JL-8A/13集成电路电流继电器;JL-8B/13集成电路电流继电器; JL-8A/21集成电路电流继电器;JL-8B/21集成电路电流继电器; JL-…