一尘不染

如何在Golang中以不同的软件包使用Gorilla Sessions

go

我有主软件包(main.go):

package main

import (
  "github.com/gorilla/sessions"
  ...
)

func main() {
  var store = sessions.NewCookieStore([]byte("secret"))

  http.HandleFunc("/", routes.Index)

  http.ListenAndServe(":8080", nil)
  ...

我还有另一个包(index.go):

package routes

import (
  "github.com/gorilla/sessions"
  ..
)

func Index(res http.ResponseWriter, req *http.Request) {
  session, _ := store.Get(req, "session-name")
  ...

如何从另一个包中获取会话值?还是应该将其传递给我的处理程序(如果是,该怎么做?)。

我是Golang的新手。请帮忙。


阅读 310

收藏
2020-07-02

共1个答案

一尘不染

我通常将依赖项包装在自己的程序包中,这让我抽象了一些我做的常见事情。对于会话,我通常大部分时间都使用相同的会话名称,因此通常会有以下内容:

package sessions

import (
    "os"
    gsessions "github.com/gorilla/sessions"
)

var store = gsessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))

func Get(req *http.Request) (*gsessions.Session, error) {
    return store.Get(req, "default-session-name")
}

func GetNamed(req *http.Request, name string) (*gsessions.Session, error) {
    return store.Get(req, name)
}

然后您可以在其他任何地方导入自己的会话包:

import (
    "net/http"
    "github.com/yourpackage/sessions"
)

func Index(rw http.ResponseWriter, r *http.Request) {
    session, err := sessions.Get(r)
    if err != nil {
        panic(err)
    }
    session.Values["test"] = "test"
    session.Save(r, rw)
}

更好的办法是只interface从会话中返回某种形式的,然后完全包装,gorilla/sessions这样除了您自己的会话包之外,任何地方都不依赖它。

2020-07-02