在golang中检查HTML文件中的用户会话

问题描述 投票:2回答:2

如何直接在HTML文件中检查用户登录会话?我已经在google上搜索了它,但我无法直接在html文件中找到检查会话,是不是可以这样做?

我唯一能找到的是通过ExecuteTemplate()传递它,这是我唯一可以做的事情吗?

session go
2个回答
0
投票

我想从你的描述中你可以在.go文件(handlerfunc)中访问一个会话变量,并希望在html文件中使用它。这相对简单,只是一个价值。是的,通过ExecuteTemplate传递它是正确的方法。会话只是一个cookie,随着请求从浏览器发送到您的服务器,它位于请求标头中。

您可以在模板的func集中为访问某种全局变量的模板设置一个func,但是你会遇到跨goroutine同步的问题(每个请求处理程序在goroutine中运行),所以更简单的方法是最好的。

您不应该尝试在模板中对会话执行操作,例如解密和提取用户ID - 这更适合您的处理程序,而且更安全,而不是模板。

首先使用您的首选库从cookie中提取它(您正在加密会话吗?),然后将其添加到视图上下文(假设您使用值的映射)。

// use a lib like gorilla sessions
session, err := store.Get(r, "session-name")
userID := session.Get("user")

// store data (here in a map[string]interface{})
data := make(map[string]interface{})
data["userID"] = userID 

// Send this data to the view
t.Execute(w, data) // Sets the . variable in templates

然后在视图中,只需使用类似的东西来访问您需要的值:

{{ .userID }}

或者是的,您可以使用javascript来访问会话,但是您需要知道它是如何加密的,如果它包含任何有价值的信息,这可能是一个安全漏洞 - 您的用户可以获得的任何js也可以获得。


0
投票

模板是迄今为止最普遍的方法。 ExecuteTemplate有第三方替代品,例如https://github.com/valyala/quicktemplate

另一种方法是进行“客户端模板化”,其中所有渲染都是使用JavaScript在客户端上完成的,并使用类似REST的/ JSON API与服务器进行通信。

我该选哪个?这取决于您的用例。如果您的网站需要实时更新并对服务器进行大量的反复操作,那么客户端脚本可以使事情变得更加容易,因此您只需要使用JavaScript函数来呈现页面的一部分,而不是JavaScript函数和等效的Go功能。它还可以创建更流畅的整体界面;例如,如果某个操作需要几秒钟来“处理”,则可以构建客户端模板和渲染,这样页面就不必完全刷新(从而在页面刷新时避免“闪烁白色”)。

另一方面,如果您有一个简单的应用程序,那么构建服务器端模板的速度会更快(您不必构建API)并导致整个页面加载时间更快。


当然,很少是应用程序所有客户端或所有全服务器端。在JavaScript中读取URL很困难,所以我看到人们使用模板引擎将对象ID注入JavaScript常量。即使采用全客户端方法,使用模板引擎来标准化所有页面之间的导航/页脚/站点布局(在服务器启动时呈现所有模板)也很有用。

© www.soinside.com 2019 - 2024. All rights reserved.