2017-10-06 34 views
0

我使用Golang Beego的包裹會議。用戶登錄時 - 會話在服務器端創建,客戶端獲取cookie。例如,會話和cookie的到期日期都是10秒。我經常向服務器發送請求,但仍然在幾秒鐘後(甚至不到10),我正在註銷 - 這很糟糕。戈蘭與Beego有效期限的會議

這裏是一個小工作示例:

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