首页  >  文章  >  后端开发  >  为什么我的 Web 应用程序中的请求之间没有维护 Gorilla 会话变量?

为什么我的 Web 应用程序中的请求之间没有维护 Gorilla 会话变量?

Susan Sarandon
Susan Sarandon原创
2024-11-03 02:31:29133浏览

Why are Gorilla Sessions Variables Not Maintained Across Requests in My Web Application?

使用 Gorilla Session 时未维护会话变量

问题

使用 Gorilla Sessions Web 工具包时,会话变量不会跨请求保留。当服务器启动并且用户访问 localhost:8100/ 时,他们将被定向到 login.html,因为会话值不存在。登录后,会话变量将被存储,并且用户将被重定向到 home.html。然而,尽管存在会话变量,打开一个新选项卡并输入 localhost:8100/ 仍会按预期将用户引导至 login.html 而不是 home.html。

说明

中出现了几个问题提供的代码:

  1. 会话路径: 会话路径定义为 /loginSession。这将会话 cookie 的有效性限制到该特定路径。为了使会话能够跨不同路径(例如 localhost:8100/home)工作,您应该将会话路径设置为 /.
  2. 语法错误: 条件 session.Values["email "] == nil 是不正确的。相反,应该使用类型断言来检查会话值是否为字符串: if val, ok := session.Values["email"].(string); ok { // 检查值是否为字符串 }.
  3. 错误处理: 不检查会话保存操作 (sessionNew.Save(req, res)) 是否有错误。添加错误处理以捕获和处理会话保存期间的任何潜在问题。
  4. SessionHandler 中的会话处理: 应在 中提供静态文件之前获取并验证会话会话处理程序方法。此外,不应在此函数中设置路由器路径,因为它不在此处的范围内。相反,在 main() 中设置路由器路径,并利用单独的函数在处理静态文件请求之前检查有效会话。

相关代码片段(解决问题后):

<code class="go">// Set session options
store.Options = &sessions.Options{
    Domain:   "localhost",
    Path:     "/",
    MaxAge:   3600 * 8, // 8 hours
    HttpOnly: true,
}

// Session handling in `SessionHandler`
func SessionHandler(res http.ResponseWriter, req *http.Request) {
    session, err := store.Get(req, "loginSession")
    if err != nil {
        // Handle the error
    }

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

以上是为什么我的 Web 应用程序中的请求之间没有维护 Gorilla 会话变量?的详细内容。更多信息请关注PHP中文网其他相关文章!

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