|
@@ -4,12 +4,60 @@ import (
|
|
|
"ddpf/model/dbm"
|
|
|
"github.com/tangs-drm/go-tool/util"
|
|
|
"github.com/tangs-drm/go-tool/log"
|
|
|
+ thttp "github.com/tangs-drm/go-tool/http"
|
|
|
+ "net/http"
|
|
|
)
|
|
|
|
|
|
var ShowLog bool
|
|
|
|
|
|
var Max_Session_Num = 10
|
|
|
-var Valid_Session_Time = 2592000000 // 一个月
|
|
|
+var Valid_Session_Time int64 = 2592000000 // 一个月
|
|
|
+
|
|
|
+var SessionLog bool
|
|
|
+
|
|
|
+func slog(format string, args... interface{}) {
|
|
|
+ if SessionLog {
|
|
|
+ log.LogD_(2, format, args...)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// UserFilterFunc过滤器,检查用户是否是登录状态
|
|
|
+var UserFilterFunc thttp.FilterFunc = func(w http.ResponseWriter, r *http.Request) int {
|
|
|
+ cookie, err := r.Cookie("token")
|
|
|
+ if err != nil {
|
|
|
+ slog("[UserFilterFunc] get cookie token error ->(%v)", err)
|
|
|
+ http.Redirect(w, r, "/", 301)
|
|
|
+ return thttp.REQUEST_RETURN
|
|
|
+ }
|
|
|
+ token := cookie.String()
|
|
|
+ // token 是36位的UUID,形如4C2FB50E-C530-7868-01DF-165B2BC47308
|
|
|
+ if len(token) != 36 {
|
|
|
+ slog("[UserFilterFunc] get empty token")
|
|
|
+ http.Redirect(w, r, "/", 301)
|
|
|
+ return thttp.REQUEST_RETURN
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查token是否合法
|
|
|
+ valid, err := CheckToken(token)
|
|
|
+ if err != nil {
|
|
|
+ slog("[UserFilterFunc] check token(%v) error -> (%v)", token, err)
|
|
|
+ http.Redirect(w, r, "/", 301)
|
|
|
+ return thttp.REQUEST_RETURN
|
|
|
+ }
|
|
|
+
|
|
|
+ if !valid {
|
|
|
+ slog("[UserFilterFunc] check token(%v) is invalid(%v)", token)
|
|
|
+ http.Redirect(w, r, "/", 301)
|
|
|
+ return thttp.REQUEST_RETURN
|
|
|
+ }
|
|
|
+
|
|
|
+ err = FlushToken(token)
|
|
|
+ if err != nil {
|
|
|
+ slog("[UserFilterFunc] flush token with token(%v) error ->(%v)", token, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ return thttp.REQUEST_CONTINUE
|
|
|
+}
|
|
|
|
|
|
// CreateSession create user session
|
|
|
// 没有uid最多同时5个地方登陆
|
|
@@ -68,4 +116,35 @@ func CheckValidSession(session string) (bool, error) {
|
|
|
return false, nil
|
|
|
}
|
|
|
return true, nil
|
|
|
+}
|
|
|
+
|
|
|
+// CheckToken 检查用户的session是否有效
|
|
|
+// 返回值1 false: 无效, true: 有效
|
|
|
+// 返回值2 是否有错误信息,如有错误,返回err,否则返回nil
|
|
|
+func CheckToken(session string) (bool, error) {
|
|
|
+ var sqlString = "SELECT * FROM SESSION WHERE TOKEN = ?"
|
|
|
+ rows, err := dbm.Db().Query(sqlString, session)
|
|
|
+ if err != nil {
|
|
|
+ log.Error("[CheckToken] check session(%v) error ->(%v)", session, err)
|
|
|
+ return false, err
|
|
|
+ }
|
|
|
+ defer rows.Close()
|
|
|
+ if !rows.Next() {
|
|
|
+ return false, nil
|
|
|
+ }
|
|
|
+
|
|
|
+ return true, nil
|
|
|
+}
|
|
|
+
|
|
|
+// FlushToken更新session对应的最后一个登录时间
|
|
|
+func FlushToken(session string) error {
|
|
|
+ var sqlString = "UPDATE SESSION SET LASTTIME = ? WHERE ID = ?"
|
|
|
+ stmt, err := dbm.Db().Prepare(sqlString)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer stmt.Close()
|
|
|
+
|
|
|
+ _, err = stmt.Exec(util.Now(), session)
|
|
|
+ return err
|
|
|
}
|