2015-06-06 3 views
-1

Прежде всего позвольте мне сказать, что я новичок в Голанге. Работая с ним уже пару недель. На самом деле нравится язык, но ...Перейти в пространство имен/область действия для глобального управления сеансом в нескольких пакетах

У меня проблемы с управлением глобальной сессией в Голанге. Я вижу, как это работает, и я могу это сделать, если область видится в одном пакете, однако я недавно создал новые пакеты для каждого из моих файлов 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 без содержания, однако он начал давать мне эту ошибку, как только я это сделал.

Любая помощь будет оценена по достоинству. Благодаря!

+0

Почему бы не использовать систему маршрутов beego? Вы можете напрямую обращаться к сеансу через контекстный объект. Нет необходимости создавать глобальный пакет сеансов. – chendesheng

+0

«Созданы новые пакеты для каждого из моих файлов go». Надеюсь, это опечатка, и вы не помещаете каждый файл '* .go' в свой собственный пакет. * Только * использовать пакеты, где это имеет смысл, то есть там, где это отдельная концепция с понятным API и/или разумно, что что-то еще захочет/нужно будет использовать пакет. Кроме того, 'globalsessionkeeper' является бедным и неидиоматичным [имя для пакета Go] (https://blog.golang.org/package-names). –

+0

Так вы можете объяснить это немного? Если у меня есть логин и файл регистра, они не должны быть в отдельных пакетах? Извините, я новичок в голанге. Попытка понять это, когда я иду. – TinuC

ответ

0

Оказывается, это работало все время. Я передал неправильное значение cookie обратно в api. Глупые ошибки вызывают всевозможные головные боли.