新闻网站怎样做seo优化/青岛做网站推广公司

新闻网站怎样做seo优化,青岛做网站推广公司,wordpress 登录用户名,佛山网站设计平台本文目录 一、模版渲染二、自定义模版函数三、cookie四、Session五、cookie、session区别六、会话攻击 一、模版渲染 在 Gin 框架中,模板主要用于动态生成 HTML 页面,结合 Go 语言的模板引擎功能,实现数据与视图的分离。 模板渲染是一种动态…

在这里插入图片描述

本文目录

  • 一、模版渲染
  • 二、自定义模版函数
  • 三、cookie
  • 四、Session
  • 五、cookie、session区别
  • 六、会话攻击

一、模版渲染

在 Gin 框架中,模板主要用于动态生成 HTML 页面,结合 Go 语言的模板引擎功能,实现数据与视图的分离。

模板渲染是一种动态生成 HTML 页面的技术,通过模板文件和动态数据的结合,Web 应用可以为每个用户生成不同的内容。Gin 使用 Go 标准库 html/template 提供模板功能,该模板引擎基于 HTML,能够避免常见的跨站脚本攻击 (XSS)。

创建一个template模版文件,其中body中的.title就是动态的数据,需要后端请求后显示。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>gin_templates</title>
</head>
<body>
{{.title}}
</body>
</html>

写一个简单的请求demo来看看模版返回。

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()// 模板解析r.LoadHTMLFiles("./templates/index.tmpl")r.GET("/index", func(ctx *gin.Context) {// 模板的渲染ctx.HTML(http.StatusOK, "index.tmpl", gin.H{"title": "hello,我是模板",})})r.Run(":9090") // 启动server
}

通过Post请求工具可以看到已经正确加载了模版内容。

在这里插入图片描述
如果有多个模版,可以统一进行对应的渲染:

	r.LoadHTMLGlob("templates/**")

如果目录为templates/post/index.tmpltemplates/user/index.tmpl这种,可以

	// **/* 代表所有子目录下的所有文件router.LoadHTMLGlob("templates/**/*")

二、自定义模版函数

那么是否可以实现下面的效果呢,答案是可以的,通过自定义模版函数进行处理即可。

在这里插入图片描述
在模板渲染中,默认情况下,Go 的模板引擎会对所有输出的内容进行 HTML 转义,以防止跨站脚本攻击(XSS)。例如,如果模板中输出的内容是

Hello
,模板引擎会将其渲染为 <div>Hello</div>,这样浏览器会将其视为普通文本,而不是 HTML 标签。

当我们把代码改为下面时,会发现进行了HTML转义,并不是我们想要的状态。

	r.GET("/index", func(c *gin.Context) {// HTML请求// 模板的渲染c.HTML(http.StatusOK, "index.tmpl", gin.H{"title": "<a href='http://baidu.com'>跳转到其他地方</a>",})})

在这里插入图片描述

在这里插入图片描述
所以现在我们可以添加一个函数,让这个模版原样输出,不再进行html转义了。(放在加载模版之前即可),并且将index中的代码改为如下:{{.title | safe }}

	r.SetFuncMap(template.FuncMap{"safe": func(str string) template.HTML {return template.HTML(str)},})

三、cookie

http是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出。

Cookie就是解决HTTP协议无状态的方案之一。

实际上就是服务器保存在浏览器上的一段信息,浏览器有了Cookie之后,每次向服务器发送请求时都会将信息发送刚给服务器,服务器就可以根据该信息处理请求。

Cookie由服务器创建,发送给浏览器,浏览器保存。

cookie的函数签名如下:

func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
参数名类型说明
namestringcookie名字
valuestringcookie值
maxAgeint有效时间,单位是秒,MaxAge=0 忽略MaxAge属性,MaxAge<0 相当于删除cookie, 通常可以设置-1代表删除,MaxAge>0 多少秒后cookie失效
pathstringcookie路径
domainstringcookie作用域
secureboolSecure=true,那么这个cookie只能用https协议发送给服务器
httpOnlybool设置HttpOnly=true的cookie不能被js获取到
	r.GET("/cookie", func(c *gin.Context) {// 设置cookiec.SetCookie("site_cookie", "cookievalue", 3600, "/", "localhost", false, true)})

通过post工具可以查到对应的cookie。
在这里插入图片描述
通过浏览器进入开发者模式也可以查看到对应的cookie。

在这里插入图片描述
也可以进行cookie读取,通过下面代码。

func main() {r := gin.Default()r.GET("/read", func(c *gin.Context) {// 根据cookie名字读取cookie值data, err := c.Cookie("site_cookie")if err != nil {// 直接返回cookie值c.String(200, "not found!")return}c.String(200, data)})r.Run(":9090") // 启动server
}

在这里插入图片描述
删除cookie比较简单,通过将将cookie的MaxAge设置为-1, 达到删除cookie的目的。

r.GET("/del", func(c *gin.Context) {// 设置cookie  MaxAge设置为-1,表示删除cookiec.SetCookie("site_cookie", "cookievalue", -1, "/", "localhost", false, true)c.String(200,"删除cookie")})

四、Session

会话(Session) 是一种用于在 Web 应用中跟踪用户状态的技术。它允许服务器在多个 HTTP 请求之间保持用户的状态信息,从而实现诸如用户登录、购物车等功能。

当用户第一次访问 Web 应用时,服务器会创建一个唯一的会话标识符(Session ID),并将其存储在服务器端的会话存储中。

Gin框架中,可以依赖gin-contrib/sessions中间件处理session。

引入session的依赖。

 go install github.com/gin-contrib/sessions@latest
package mainimport ("fmt""github.com/gin-contrib/sessions""github.com/gin-contrib/sessions/cookie""github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 创建基于cookie的存储引擎,secret 参数是用于加密的密钥,用于对存储在 Cookie 中的会话数据进行加密store := cookie.NewStore([]byte("secret"))// sessions.Sessions:注册会话中间件。这个中间件会自动处理会话的创建、读取和更新,并将会话数据存储在客户端的 Cookie 中。// 设置session中间件,参数mysession,指的是session的名字,也是cookie的名字// store是前面创建的存储引擎,我们可以替换成其他存储引擎r.Use(sessions.Sessions("mysession", store))r.GET("/hello", func(c *gin.Context) {// 初始化session对象session := sessions.Default(c)// 通过session.Get读取session值// session是键值对格式数据,因此需要通过key查询数据if session.Get("hello") != "world" {fmt.Println("没读到")// 设置session数据session.Set("hello", "world")session.Save()}c.JSON(200, gin.H{"hello": session.Get("hello")})})r.Run(":8080")
}

在这里插入图片描述
通过上面代码,我们可以验证session。这里我们是使用cookie进行存储的,也可以通过redis进行存储。

通过cookie进行存储的session是这样的:当用户第一次访问服务器时,服务器会为用户创建一个唯一的会话标识符(Session ID),并将与该会话相关的数据存储在服务器端(如内存、数据库或文件系统中)。

服务器将 Session ID 发送给客户端(通常是通过设置一个 Cookie)。客户端(浏览器)会在后续的请求中自动将这个 Cookie(包含 Session ID)发送回服务器。

服务器通过客户端发送的 Session ID,从服务器端的存储中找到对应的会话数据,从而恢复用户的会话状态。

五、cookie、session区别

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie 的工作原理。

Cookie是存储在客户端(用户浏览器)的小块数据,可以用来记住用户的相关信息,例如登录凭证或偏好设置。它们随每个HTTP请求发送给服务器,并且可以被服务器读取以维持会话或个性化用户体验。

再比如想象用户登录银行网站。服务器创建一个包含会话标识符的Cookie,并通过Set-Cookie头部发送回用户的浏览器。浏览器存储此Cookie,并在随后的请求中将其发送回服务器,允许服务器识别用户并在多个页面加载中保持他们的登录状态。

若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。

若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。这种称为持久Cookie。


客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。每个用户访问服务器都会建立一个session并自动分配一个SessionId,用于标识用户的唯一身份。

也就是会话用于跟踪用户在多个页面请求期间的状态。它们通常存储在服务器端,并且与唯一的会话标识符(通常是会话ID)相关联,会话ID作为Cookie发送给客户端。会话允许服务器在用户访问期间记住有关用户的信息。

用户在电子商务网站上购物。服务器为用户创建一个会话,存储他们的购物车项目和其他相关信息。会话ID作为Cookie发送给用户的浏览器。随着用户在网站上导航,Cookie中的会话ID允许服务器访问用户会话数据,使用户能够无缝购物体验。

服务器通过SessionId作为key,读写对应的value,这就达到了保持会话信息的目的。


所以,为什么有了cookie还要有session?

  • 存储位置和安全性

cookie 数据存储在客户端(用户的浏览器中)。由于 Cookie 数据存储在客户端,用户可以轻松查看和修改 Cookie 内容。即使通过加密和签名增强安全性,也无法完全防止用户篡改。Cookie 的大小有限制,通常不超过 4KB,且浏览器对每个域名的 Cookie 数量也有限制。

Session 数据存储在服务器端,客户端只保存一个 Session ID(通常通过 Cookie 传递)。由于数据存储在服务器端,用户无法直接访问或修改 Session 数据,安全性更高。服务器端的存储容量通常比客户端大得多,可以存储更复杂的数据结构。

  • 数据隐私和敏感信息

Cookie 数据存储在客户端,即使是加密的,也存在被窃取或篡改的风险。因此,不适合存储敏感信息(如密码、用户身份信息等)。Session 数据存储在服务器端,可以安全地存储敏感信息。例如,用户登录后,服务器可以将用户的认证状态和权限信息存储在 Session 中,而无需暴露给客户端。

  • 分布式和可扩展性

Cookie 数据存储在客户端,不依赖于服务器的存储。但如果需要在多个服务器之间共享会话数据(如分布式应用),Cookie 无法直接实现。

Session 数据存储在服务器端,可以通过多种方式实现分布式存储(如 Redis、数据库等),从而支持分布式应用和负载均衡。在分布式环境中,Session ID 可以通过 Cookie 传递给客户端,而实际的会话数据存储在共享的存储系统中,从而实现会话的共享和同步。

Session 数据存储在服务器端,客户端只需要发送一个轻量级的 Session ID(通常是一个短字符串),从而减轻客户端的负担,提高性能。

六、会话攻击

如果客户端存储的 SessionID 被劫持,攻击者确实可能通过获取 SessionID 冒充用户身份,从而对服务器进行非法操作。然而,虽然无法完全杜绝 SessionID 被窃取的风险,但可以通过多种防御措施来降低这种风险,并防止攻击者利用窃取的 SessionID 进行有效攻击。

  • 使用 HTTPS 协议

通过 HTTPS 加密客户端与服务器之间的通信,可以防止 SessionID 在传输过程中被中间人攻击窃取。

  • 设置 Cookie 的 HttpOnly 和 Secure 属性

HttpOnly:设置 HttpOnly 属性后,Cookie 无法被客户端脚本(如 JavaScript)访问,从而防止通过 XSS 攻击窃取 SessionID。

Secure:设置 Secure 属性后,Cookie 只会在 HTTPS 协议下传输,进一步防止 SessionID 被窃取。

  • 定期更新 SessionID

在用户登录、权限变更或定期时间间隔内更新 SessionID,可以减少攻击者利用旧 SessionID 的机会。同时通过检测客户端的 User-Agent、IP 地址或其他标识信息是否发生变化,可以判断是否为合法用户。如果检测到异常,可以要求用户重新登录。

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

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

相关文章

【AI绘画】大卫• 霍克尼风格——自然的魔法(一丹一世界)

大卫• 霍克尼&#xff0c;很喜欢这个老头&#xff0c;“艺术是一场战斗”。老先生零九年有了iphone&#xff0c;开始用iphone画画&#xff0c;一零年开始用ipad画画&#xff0c;用指头划拉&#xff0c;据说五分钟就能画一幅&#xff0c;每天早上随手画几幅送给身边的朋友。很c…

解码 NLP:从萌芽到蓬勃的技术蜕变之旅

内容概况&#xff1a; 主要讲述NLP专栏的内容和NLP的发展及其在现代生活中的广泛应用。专栏强调实践为主、理论为辅的学习方法&#xff0c;并通过多个生活场景展示了NLP技术的实际应用&#xff0c;如对话机器人、搜索引擎、翻译软件、电商推荐和智能客服等。 这边我就不多做自我…

解决DeepSeek服务器繁忙问题的实用指南

目录 简述 1. 关于服务器繁忙 1.1 服务器负载与资源限制 1.2 会话管理与连接机制 1.3 客户端配置与网络问题 2. 关于DeepSeek服务的备用选项 2.1 纳米AI搜索 2.2 硅基流动 2.3 秘塔AI搜索 2.4 字节跳动火山引擎 2.5 百度云千帆 2.6 英伟达NIM 2.7 Groq 2.8 Firew…

AI Agent Service Toolkit:一站式大模型智能体开发套件

项目简介 该工具包基于LangGraph、FastAPI和Streamlit构建,提供了构建和运行大模型Agent的最小原子能力,包含LangGraph代理、FastAPI服务、用于与服务交互的客户端以及一个使用客户端提供聊天界面的Streamlit应用。用户可以利用该工具包提供的模板快速搭建基于LangGraph框架…

论文概览 |《Urban Analytics and City Science》2023.10 Vol.50 Issue.8

本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年10月第50卷第8期的论文的题目和摘要&#xff0c;一共包括21篇SCI论文&#xff01; 论文1 Advances in geospatial approaches to transport networks and sustainable mobility …

大语言模型推理能力从何而来?

前言 DeepSeek R1采用强化学习进行后训练&#xff0c;通过奖励机制和规则引导模型生成结构化思维链&#xff08;CoT&#xff09;&#xff0c;从而显著提升了推理能力。这一创新方法使得DeepSeek R1能够在无需大量监督数据的情况下&#xff0c;通过自我进化发展出强大的推理能力…

STM32MP157A单片机移植Linux驱动深入版

需求整理 在Linux设备树中新增leds节点&#xff0c;其有3个gpio属性&#xff0c;分别表示PE10对应led1&#xff0c;PF10对应led2&#xff0c;PE8对应led3&#xff0c;设备树键值对如下&#xff1a; leds { led1-gpio <&gpioe 10 0>; led2-gpio &l…

http代理IP怎么实现?如何解决代理IP访问不了问题?

HTTP代理是一种网络服务&#xff0c;它充当客户端和目标服务器之间的中介。当客户端发送请求时&#xff0c;请求首先发送到代理服务器&#xff0c;然后由代理服务器转发到目标服务器。同样&#xff0c;目标服务器的响应也会先发送到代理服务器&#xff0c;再由代理服务器返回给…

Grok 3.0 Beta 版大语言模型评测

2025年2月17日至18日&#xff0c;全球首富埃隆马斯克&#xff08;Elon Musk&#xff09;携手其人工智能公司xAI&#xff0c;在美国重磅发布了Grok 3.0 Beta版。这款被誉为“迄今为止世界上最智能的语言模型”的AI&#xff0c;不仅集成了先进的“DeepSearch”搜索功能&#xff0…

基于COSTAR模型的内容创作:如何用框架提升写作质量

目录 前言1. Context&#xff08;上下文&#xff09;&#xff1a;理解背景&#xff0c;奠定写作基础1.1 何为上下文1.2 上下文的作用1.3 案例解析 2. Objective&#xff08;目标&#xff09;&#xff1a;明确写作方向&#xff0c;避免跑题2.1 确立目标2.2 如何设定目标2.3 案例…

Springboot应用开发工具类整理

目录 一、编写目的 二、映射工具类 2.1 依赖 2.2 代码 三、日期格式 3.1 依赖 3.2 代码 四、加密 4.1 代码 五、Http请求 5.1 依赖 5.2 代码 六、金额 6.1?代码 七、二维码 7.1 依赖 7.2 代码 八、坐标转换 8.1 代码 九、树结构 9.1?代码 9.1.1 节点 …

【Research Proposal】基于提示词方法的智能体工具调用研究——研究问题

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;研究问题1. 如何优化提示词方法以提高智能体的工具调用能力&#xff1f;2. 如何解决提示词方法在多模态任务中的挑战&#xff1f;3. 如何通过提示词优化智能体…

Java 大视界 -- 国际竞争与合作:Java 大数据在全球市场的机遇与挑战(94)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

25旅游管理研究生复试面试问题汇总 旅游管理专业知识问题很全! 旅游管理复试全流程攻略 旅游管理考研复试真题汇总

旅游管理复试很难&#xff1f;&#xff01; 别怕&#xff01;经验超丰富的老学姐来给你们出谋划策啦&#xff01; 最近是不是被旅游管理考研复试折磨得够呛&#xff1f;莫慌&#xff01;我这有着丰富复试指导经验的老学姐来帮你们排雷&#xff0c;助力大家顺利上岸&#xff01…

美的楼宇科技基于阿里云 EMR Serverless Spark 构建 LakeHouse 湖仓数据平台

作者&#xff1a;美的楼宇科技事业部 先行研究中心智能技术部 美的楼宇科技 IoT 数据平台建设背景 美的楼宇科技事业部&#xff08;以下简称楼宇科技&#xff09;是美的集团旗下五大板块之一&#xff0c;产品覆盖多联机组、大型冷水机组、单元机、机房空调、扶梯、直梯、货梯…

2025asp.net全栈技术开发学习路线图

2025年技术亮点‌&#xff1a; Blazor已全面支持WebAssembly 2.0标准 .NET 8版本原生集成AI模型部署能力 Azure Kubernetes服务实现智能自动扩缩容 EF Core新增向量数据库支持特性 ‌ASP.NET 全栈开发关键技术说明&#xff08;2025年视角&#xff09;‌ 以下技术分类基于现…

Linux设备驱动-练习

练习要求&#xff1a; 一、设备树 1、配置设备树信息&#xff1a;将3个led灯和1个风扇使用到的设备信息配置到设备树中 二、设备驱动层 1、通过of_find_node_by_name、of_get_named_gpion等内核核心层统一的api接口调用外设&#xff1b; 2、通过udev设备管理器自动注册并创建设…

竞争与冒险问题【数电速通】

时序逻辑电路&#xff1a; 组合逻辑电路中的竞争与冒险问题&#xff1a; 在组合逻辑电路中&#xff0c;竞争和冒险是两种常见的时序问题&#xff0c;它们通常由电路的延时特性和不完美的设计引起。下面是这两种现象的详细解释&#xff1a; 1. 竞争&#xff08;Race Condition&…

Microsoft 365 Copilot中使用人数最多的是哪些应用

今天在浏览Microsoft 365 admin center时发现&#xff0c;copilot会自动整理过去30天内所有用户使用copilot的概况&#xff1a; 直接把这个图丢给copilot让它去分析&#xff0c;结果如下&#xff1a; 总用户情况 总用户数在各应用中均为 561 人&#xff0c;说明此次统计的样本…

ue5.2.1 quixel brideg显示asset not available in uAsset format

我从未见过如此傻x的bug&#xff0c;在ue5.2.1上通过内置quixel下载资源显示 asset not available in uAsset format 解决办法&#xff1a;将ue更新到最新版本&#xff0c;通过fab进入商场选择资源后add to my library 点击view in launcher打开epic launcher&#xff0c;就可…