go 随websocket存亡的token

 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 }

token

 1 package Network
 2
 3 import (
 4     "logs"
 5     "time"
 6     "token"
 7
 8     "github.com/gorilla/websocket"
 9 )
10
11 type ClientData struct {
12     conn  *websocket.Conn
13     token string
14 }
15
16 var wsClients = make(map[string]ClientData)
17
18 // 是否在线
19 func isOnline(clientID string) bool {
20     lock.RLock()
21     _, isOnline := wsClients[clientID]
22     lock.RUnlock()
23     return isOnline
24 }
25
26 // --------------------------------------------- 连接管理部分
27
28 // 增加WebSocket连接
29 func addClient(clientID string, con *websocket.Conn) (canAdd bool) {
30
31     if isOnline(clientID) {
32         writeResponseToClient(clientID, ServerResponse{
33             Method:  "/wsLogin",
34             Code:    noticeForceQuit,
35             Message: mForceQuit,
36             Result:  nil,
37         })
38         deleteClient(clientID)
39         time.Sleep(time.Millisecond) // 如果不睡眠或者睡眠时间太短,两个连接都会被同时关掉
40         logs.Print(clientID, mForceQuit)
41         addConnection(clientID, con)
42         return false
43     }
44     addConnection(clientID, con)
45     return true
46 }
47
48 func addConnection(clientID string, con *websocket.Conn) {
49     clientData := ClientData{
50         conn:  con,
51         token: "",
52     }
53     token.New(clientID, &clientData.token, func() { //此函数用于每次token变化后将token写回客户端
54         //更新完client后才能writeResponse,注意死锁
55         lock.Lock()
56         wsClients[clientID] = clientData
57         lock.Unlock()
58         writeResponseToClient(clientID, ServerResponse{
59             Code:    Success,
60             Method:  "/token",
61             Message: "",
62             Result:  map[string]string{"Token": clientData.token},
63         })
64     })
65 }
66
67 // 获取客户端连接
68 func getClient(clientID string) (clientConn *websocket.Conn, isOnline bool) {
69
70     lock.RLock()
71     clientData, ok := wsClients[clientID]
72     lock.RUnlock()
73     return clientData.conn, ok
74 }
75
76 // 删除WebSocket连接
77 func deleteClient(clientID string) {
78     clientData, ok := wsClients[clientID]
79     if !ok {
80         return
81     }
82     lock.Lock()
83     clientData.conn.Close()
84     token.Del(clientData.token)
85     delete(wsClients, clientID)
86     lock.Unlock()
87 }

websocket连接管理

因为登录是用websocket,返回前端token的也是websoket(websoket验证成功后马上返回token),所以websocket在,token就在,websocket关闭连接后token也结束了生命周期

时间: 2024-08-10 17:42:50

go 随websocket存亡的token的相关文章

使用WebSocket构建实时WEB

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3795075.html 1 WebSocket与传统Web实时通信技术 1.1 WebSocket HTTP是一种典型的单工模式.即基于Request/Response的方式与服务器进行交互.HTML5提供了浏览器与服务端的双工通信协议WebSocket. 1.2传统Web实时通信技术 轮询 Comet 长轮询 Flash

WebSocket实战之——携带Token验证绑定clientId到uid(微信)

HTML代码:通过为. <!DOCTYPE> <html> <meta charset="utf-8"/> <title>WebSocket Test</title> <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.min.js" type="text/javascript"></script> &l

web新特性 之 WebSocket

详情参见:你真的了解WebSocket吗?     WebSocket系列教程   HTML5新特性之WebSocket WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实现了浏览器与服务器全双工(full-duplex)通信.其本质是保持TCP连接,在浏览器和服务端通过Socket进行通信. 服务端与客户端的连接不断开,实现全双工的操作.及服务端或是客户端都会给对方发送消息. WebSocke

异步通信----WebSocket

什么是WebSocket? WebSocket API是下一代客户端-服务器的异步通信方法.该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序.WebSocket目前由W3C进行标准化.WebSocket已经受到Firefox 4.Chrome 4.Opera 10.70以及Safari 5等浏览器的支持. WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息.WebSocket并不限于以Ajax(或XHR)方式通

websocket可以做什么

本篇介绍的是websocket,但是并不介绍它的协议格式,一般能看明白http头也能明白websocket在协议切换前的协商,能看明白IP报头也就对websocket在协议切换后通讯格式不陌生.websocket在可靠传输TCP之上,提供了消息包的传输服务,即是在websocket的一端的应用层调用websocket发送指定大小的消息,在另一端的websocket就会向协议处理过程提交同样大小的消息.至于消息的格式客户自定义.本篇将通过http协议文档串联起来,了解websocket想要解决什么

python websocket学习使用

前言 今天看了一些资料,记录一下心得. websocket是html5引入的一个新特性,传统的web应用是通过http协议来提供支持,如果要实时同步传输数据,需要轮询,效率低下 websocket是类似socket通信,web端连接服务器后,握手成功,一直保持连接,可以理解为长连接,这时服务器就可以主动给客户端发送数据,实现数据的自动更新. 使用websocket需要注意浏览器和当前的版本,不同的浏览器提供的支持不一样,因此设计服务器的时候,需要考虑. 进一步简述 websocket是一个浏览器

高效简易websocket服务开发包beetle

websocket的主要是为了解决在web上应用长连接进行灵活的通讯应用而产生,但websocket本身只是一个基础协议,对于消息上还不算灵活,毕竟websocket只提供文本和二进制流这种基础数据格式.在实际应用则更偏向于对象消息的处理,而在这基础上更希望集成一系列的消息路由机制来解决消息处理上的问题.为了解决以上问题beetle针对websocket进行了一些高层次的封装,让服务端处理消息变得更简单灵活.以下通过不同的示例介绍Beetle websocket开发包的简易性. hello wo

WebSocket 的鉴权授权方案

引子 WebSocket 是个好东西,为我们提供了便捷且实时的通讯能力.然而,对于 WebSocket 客户端的鉴权,协议的 RFC 是这么说的: This protocol doesn't prescribe any particular way that servers canauthenticate clients during the WebSocket handshake. The WebSocketserver can use any client authentication me

高效简易开发基于websocket 的通讯应用

websocket的主要是为了解决在web上应用长连接进行灵活的通讯应用而产生,但websocket本身只是一个基础协议,对于消息上还不算灵活,毕竟websocket只提供文本和二进制流这种基础数据格式.在实际应用则更偏向于对象消息的处理,而在这基础上更希望集成一系列的消息路由机制来解决消息处理上的问题.为了解决以上问题beetle针对websocket进行了一些高层次的封装,让服务端处理消息变得更简单灵活.以下通过不同的示例介绍Beetle websocket开发包的简易性. hello wo