2017-10-06 25 views
0

私はGolangを使用しますBeegoのパッケージセッションユーザーがログインすると、セッションはサーバー側で作成され、クライアントはCookieを取得します。たとえば、セッションとCookieの両方の有効期限は10秒です。私は頻繁にサーバーに十分なリクエストを送信しますが、数秒後でも(10未満の場合でも)ログアウトされています。これは悪いことです。Beego有効期限を持つGolangセッション

はここで小さな作業例です:

package main 

import (
    "fmt" 
    "net/http" 

    "github.com/astaxie/beego/session" 
) 

var globalSessions *session.Manager 

func sessionExists(w http.ResponseWriter, r *http.Request) bool { 
    sess, err := globalSessions.SessionStart(w, r) 
    defer sess.SessionRelease(w) 

    if err != nil { 
     fmt.Println("Error to start session: " + err.Error()) 
     return false 
    } 

    if sessUsername := sess.Get("username"); sessUsername == nil { 
     return false 
    } 

    return true 
} 

func login(w http.ResponseWriter, r *http.Request) { 
    sess, err := globalSessions.SessionStart(w, r) 
    defer sess.SessionRelease(w) 

    if err != nil { 
     fmt.Println("Error to start session: " + err.Error()) 
     return 
    } 

    sess.Set("username", "user") 
    http.Redirect(w, r, "/", http.StatusSeeOther) 
} 

func handler(w http.ResponseWriter, r *http.Request) { 
    if !sessionExists(w, r) { 
     fmt.Fprintf(w, "NOT logged in") 
    } else { 
     fmt.Fprintf(w, "Logged in") 
    } 
} 

func main() { 
    globalSessions, _ = session.NewManager("memory", &session.ManagerConfig{ 
     CookieName:  "msessionid", 
     EnableSetCookie: true, 
     Gclifetime:  2, 
     Maxlifetime:  10, 
     CookieLifeTime: 10}) 

    go globalSessions.GC() 

    http.HandleFunc("/", handler) 
    http.HandleFunc("/login", login) 

    err := http.ListenAndServe("0.0.0.0:9998", nil) 
    if err != nil { 
     fmt.Println("Can't start HTTP listener") 
    } 
} 

...それを起動し、localhost:9998/loginに行く - あなたがLogged inが表示され、メインページにリダイレクトされます。毎秒更新してください。数秒後にNOT logged inという応答が得られます。私はすべてのリクエストがサーバー側でセッションの有効期限を更新すると思っていました。

私には何が欠けていますか?またはこれはセッションパッケージのバグですか?

答えて

0
 package hjwt 

    import (
     "fmt" 
     "time" 

     jwt "github.com/dgrijalva/jwt-go" 
     "github.com/hzwy23/hcloud/logs" 
    ) 

    var (
     key []byte = []byte("[email protected]") 
    ) 

    // json web token 
    func GenToken() string { 
     claims := &jwt.StandardClaims{ 
      NotBefore: int64(time.Now().Unix()), 
      ExpiresAt: int64(time.Now().Unix() + 1000), 
      Issuer: "hzwy23", 
     } 

     token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) 
     ss, err := token.SignedString(key) 
     if err != nil { 
      logs.Error(err) 
      return "" 
     } 
     return ss 
    } 

    // Verify that token is valid 
    func CheckToken(token string) bool { 
     _, err := jwt.Parse(token, func(*jwt.Token) (interface{}, error) { 
      return key, nil 
     }) 
     if err != nil { 
      fmt.Println("parase with claims failed.", err) 
      return false 
     } 
     return true 
    } 


    // Next, add the filter before the beego starts. The filter code is as follows: 

    beego.InsertFilter("/platform/*", beego.BeforeRouter, func(ctx *context.Context) { 
      cookie, err := ctx.Request.Cookie("Authorization") 
      if err != nil || !hjwt.CheckToken(cookie.Value) { 
       http.Redirect(ctx.ResponseWriter, ctx.Request, "/", http.StatusMovedPermanently) 
      } 
     }) 

    // In this process, you need to set the JSON web token value to cookies, where the cookies method is set as follows in.Golang: 


    token := hjwt.GenToken() 
    cookie := http.Cookie{Name: "Authorization", Value: token, Path: "/", MaxAge: 3600} 
    http.SetCookie(w, &cookie) 

これは例https://github.com/nan1888/beego_jwt

ある
関連する問題