首页  >  文章  >  后端开发  >  为什么我的 Gorilla 会话无法跨 Go 应用程序中的请求持久保留?

为什么我的 Gorilla 会话无法跨 Go 应用程序中的请求持久保留?

Linda Hamilton
Linda Hamilton原创
2024-11-03 05:19:03698浏览

Why are my Gorilla Sessions not persisting across requests in my Go application?

Go 中的 Gorilla 会话故障排除

问题描述

使用 Gorilla 会话时,不会跨请求维护会话变量。尽管成功登录并存储了会话变量,应用程序仍将用户引导至登录页面。

解决方案

1.正确的路径配置:

会话存储无法从其他路径访问,因为路径设置为“/loginSession”。将其更改为“/”以使会话可以在整个应用程序中访问。

2.会话值验证:

不要将 session.Values["email"] 与 nil 进行比较。相反,将值断言为字符串,并使用 val == "".

3 检查它是否为空。错误处理:

确保使用 err := sessionNew.Save(req, res) 保存会话时处理错误。

4. SessionHandler 中的会话验证:

在 SessionHandler 中提供静态文件之前验证会话。如果电子邮件会话值不存在,则重定向用户登录。

代码修复:

初始化函数:

<code class="go">func init() {
    store.Options = &sessions.Options{
        Domain:   "localhost",
        Path:     "/",
        MaxAge:   3600 * 8, // 8 hours
        HttpOnly: true,
    }
}</code>

SessionHandler:

<code class="go">func SessionHandler(res http.ResponseWriter, req *http.Request) {
    session, err := store.Get(req, "loginSession")
    if err != nil {
        // Handle the error
    }

    if session.Values["email"] == "" {
        http.Redirect(res, req, "html/login.html", http.StatusFound)
    } else {
        http.Redirect(res, req, "html/home.html", http.StatusFound)
    }
}</code>

安全建议:

此外,使用 bcrypt 进行密码散列并参数化 SQL 查询以避免出现问题至关重要潜在的漏洞。

以上是为什么我的 Gorilla 会话无法跨 Go 应用程序中的请求持久保留?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn