1 package token 2 3 import ( 4 "crypto/md5" 5 "fmt" 6 "io" 7 "math/rand" 8 "sync" 9 "time" 10 ) 11 12 type User struct { 13 ID string 14 Timer *time.Timer 15 } 16 17 var Token map[string]*User = make(map[string]*User) 18 var maxLiveTime time.Duration = time.Hour * 24 // Token更新时间暂定为24小时 19 var lock sync.RWMutex 20 21 const randStringLen = 16 22 23 func randString() string { 24 str := make([]byte, randStringLen) 25 for i := 0; i < randStringLen; i++ { 26 str[i] = byte(rand.Uint32() & ((1 << 7) - 1)) 27 } 28 return string(str) 29 } 30 31 func New(userID string, token *string, writeToken func()) { 32 lock.Lock() 33 delete(Token, *token) 34 hash := md5.New() 35 io.WriteString(hash, userID) 36 io.WriteString(hash, time.Now().String()) 37 *token = fmt.Sprintf("%x", hash.Sum(nil)) 38 timer := time.AfterFunc(maxLiveTime, func() { New(userID, token, writeToken) }) 39 Token[*token] = &User{ 40 ID: userID, 41 Timer: timer, 42 } 43 lock.Unlock() 44 writeToken() 45 } 46 47 func Del(token string) { 48 lock.Lock() 49 defer lock.Unlock() 50 user := Token[token] 51 user.Timer.Stop() 52 delete(Token, token) 53 } 54 55 func GetUser(token string) (user *User, exisToken bool) { 56 lock.RLock() 57 defer lock.RUnlock() 58 user, exisToken = Token[token] 59 return user, exisToken 60 }
相关文章: