How to use Gorilla Sessions in Golang in different packages

喜夏-厌秋 提交于 2019-12-12 01:16:47

问题


I have main package (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)
  ...

And I have another package (index.go):

package routes

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

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

How can I get session value from another package? Or should I pass it to my Handler (if yes how to do it?).

I am new in Golang. Please, help.


回答1:


I generally wrap my dependencies in their own package, which let's me abstract away some of the common things I do. For sessions, I usually use the same session name most of the time, so I would usually have something like this:

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)
}

And then anywhere else you can just import your own sessions package:

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)
}

Even better would be to only return an interface of some sort from sessions, and completely wrap the gorilla/sessions so that aren't dependent on it anywhere except for your own sessions package.



来源:https://stackoverflow.com/questions/54028304/how-to-use-gorilla-sessions-in-golang-in-different-packages

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!