Прежде всего позвольте мне сказать, что я новичок в Голанге. Работая с ним уже пару недель. На самом деле нравится язык, но ...Перейти в пространство имен/область действия для глобального управления сеансом в нескольких пакетах
У меня проблемы с управлением глобальной сессией в Голанге. Я вижу, как это работает, и я могу это сделать, если область видится в одном пакете, однако я недавно создал новые пакеты для каждого из моих файлов go. Я сделал это, потому что я читал, что это лучшая практика и хороша для повторного использования.
С тех пор, как я переместил файлы go в свои собственные пакеты вместо одного пакета, управление сеансом сломалось. Он пытается создать новый сеанс каждый раз вместо повторного использования существующего сеанса. Вот код, чтобы дать вам понимание того, что я делаю:
package main
import (
"net/http"
"api/login"
"api/globalsessionkeeper"
"github.com/astaxie/beego/session"
)
func main() {
http.HandleFunc("/login", login.DoLogin)
og.Fatal(http.ListenAndServe(":8000", nil))
}
func Index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
}
func init() {
var err error
fmt.Println("Session init")
globalsessionkeeper.GlobalSessions, err = session.NewManager("mysql", `{"enableSetCookie":true, "SessionOn":true, "cookieName":"globalsession_id","gclifetime":120,"ProviderConfig":"[email protected](172.16.0.23:3306)/databse"}`)
if err != nil {
fmt.Printf("Error")
}
globalsessionkeeper.GlobalSessions.SetSecure(true)
go globalsessionkeeper.GlobalSessions.GC()
}
пакет globalsessionkeeper (я создал это только так я могу повторно использовать глобальную переменную внутри всех других packages..ie «пакет входа» .. и т.д.)
package globalsessionkeeper
import (
"github.com/astaxie/beego/session"
_ "github.com/astaxie/beego/session/mysql"
)
//Global Variable
var GlobalSessions *session.Manager
Вот унтер из функции входа/пакета. Это работало отлично, все было в одной упаковке:
if validated == true {
//create session using the request data which includes the cookie/sessionid
sessionStore, err := globalsessionkeeper.GlobalSessions.SessionStart(w, r)
if err != nil {
//need logging here instead of print
fmt.Printf("Error, could not start session %v\n", err)
break
}
defer sessionStore.SessionRelease(w) //update db upon completion for request
if sessionStore.Get("uniquevalue") == nil {
//need logging here instead of print
fmt.Printf("uniquevalue not found, Saving Session, Get has %v\n", sessionStore)
fmt.Printf("uniquevalue not found, Saving Session, Get has %v\n", sessionStore.Get("uniquevalue"))
err = sessionStore.Set("uniquevalue", input.uniquevalue)
if err != nil {
//need logging here instead of print
fmt.Printf("Error while writing to DB, %v\n", err)
break
}
} else {
//need logging here instead of print
fmt.Printf("Found Session! Session uniquevalue = %v\n", sessionStore.Get("uniquevalue"))
}
//Send back 204 no content (with cookie)
w.WriteHeader(http.StatusNoContent)
} else {
fmt.Printf("Login Failed")
w.WriteHeader(http.StatusUnauthorized)
}
База данных имеет правильную запись. Он имеет уникальное значение, хранящееся для каждого сеанса, который он создает. Вот некоторые выходы, а также:
answer = true
uniquvalue not found, Saving Session, Get has &{0xc208046b80 f08u0489804984988494994 {{0 0} 0 0 0 0} map[]}
uniquevalue not found, Saving Session, Get has <nil>
2015/06/06 17:32:26 http: multiple response.WriteHeader calls
И, конечно, многократный response.WriteHeader что-то еще, что я должен исправить. Первоначально процедура go начиналась с отправки 200OK, но я хотел изменить это на 204 без содержания, однако он начал давать мне эту ошибку, как только я это сделал.
Любая помощь будет оценена по достоинству. Благодаря!
Почему бы не использовать систему маршрутов beego? Вы можете напрямую обращаться к сеансу через контекстный объект. Нет необходимости создавать глобальный пакет сеансов. – chendesheng
«Созданы новые пакеты для каждого из моих файлов go». Надеюсь, это опечатка, и вы не помещаете каждый файл '* .go' в свой собственный пакет. * Только * использовать пакеты, где это имеет смысл, то есть там, где это отдельная концепция с понятным API и/или разумно, что что-то еще захочет/нужно будет использовать пакет. Кроме того, 'globalsessionkeeper' является бедным и неидиоматичным [имя для пакета Go] (https://blog.golang.org/package-names). –
Так вы можете объяснить это немного? Если у меня есть логин и файл регистра, они не должны быть в отдельных пакетах? Извините, я новичок в голанге. Попытка понять это, когда я иду. – TinuC