Golang和Gorilla会话-缓存阻止注销功能

Dav*_*ane 1 session caching go gorilla

我已经构建了一个使用Go Gorilla会话包的应用程序。一切似乎都很好,除非我注销时实现

func logout(w http.ResponseWriter, r *http.Request) {
  session, _ := store.Get(r, "authsesh")
  session.Values["access"] = "denied"
  session.Save(r, w)
  http.Redirect(w, r, "/", 302)
  return
}
Run Code Online (Sandbox Code Playgroud)

因为需要认证的页面由浏览器缓存,所以注销后仍然可以访问它。我该如何解决?有没有一种方法可以防止浏览器缓存页面?Cookie没什么问题,如果我清除缓存并保留Cookie,则可以看到注销已达到预期的效果。

eli*_*rar 5

在处理程序中设置正确的缓存头:

w.Header().Set("Cache-Control", "no-cache, private, max-age=0")
w.Header().Set("Expires", time.Unix(0, 0).Format(http.TimeFormat))
w.Header().Set("Pragma", "no-cache")
w.Header().Set("X-Accel-Expires", "0")
Run Code Online (Sandbox Code Playgroud)

请注意,我们设置了多个标头来说明代理和HTTP / 1.0客户端。

您可以将它们包装到也可以应用的中间件中:

func NoCache(h http.Handler) http.Handler) {
    fn := func(w http.ResponseWriter, r *http.Request) {
        // Set the headers
    }

    return http.HandlerFunc(fn)
}

// In your router
http.Handle("/user-dashboard", NoCache(http.HandlerFunc(YourDashboardHandler))
Run Code Online (Sandbox Code Playgroud)