Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 跟踪Golang的在线用户_Session_Go_Server - Fatal编程技术网

Session 跟踪Golang的在线用户

Session 跟踪Golang的在线用户,session,go,server,Session,Go,Server,很久以前,我和Golang建立了一个网站,现在,我想跟踪在线用户 我想在没有Redis和SessionID的情况下实现这一点 我工作的最佳方式是什么 我编写了一个全局处理程序: type Tracker struct { http.Handler } func NewManager(handler http.Handler) *Tracker { return &Tracker{Handler: handler} } func (h *Tracker) ServeHT

很久以前,我和Golang建立了一个网站,现在,我想跟踪在线用户

我想在没有Redis和SessionID的情况下实现这一点

我工作的最佳方式是什么

我编写了一个全局处理程序:

type Tracker struct {
    http.Handler
}

func NewManager(handler http.Handler) *Tracker {
    return &Tracker{Handler: handler}
}

func (h *Tracker) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    log.Println(r.RemoteAddr)
    h.Handler.ServeHTTP(w,r)
}
。 .

我认为我能做的工作之一是:

在客户机中添加一个sessionID,并将其保存在服务器上的映射中,然后计算在线用户数并跟踪


这是一种好的、正确的方法吗?

一个全局处理程序、中间件(如果您使用的是路由器pkg,请看这一点)或者只是在流行页面上调用stats函数就足够了。小心排除你不关心的机器人、rss点击或其他流量

假设您有一个进程,并且希望在过去5分钟内在线跟踪用户,是的,地图服务器端就可以了,您可以发布令牌(取决于用户是否允许cookie,每个请求占用带宽),或者只是散列ip(工作得很好,可能会有轻微的计算不足)。然后需要在一段时间后使它们过期,并使用互斥锁来保护它们。重新启动时,您会丢失计数,如果运行两个进程,则无法执行此操作,这是内存存储的缺点,您需要另一个缓存进程来保持。因此,这不适用于大型站点,但您可以很容易地在以后使用更持久的存储

var PurgeInterval = 5 * time.Minute
var identifiers = make(map[string]time.Time)
var mu sync.RWMutex


诸如此类。

感谢您的完美解释,我如何为每个未登录我的网站的用户设置专属id?可能许多用户使用单一IP地址,远程端口太多。你能帮我吗?这不是一个大问题(这是我提到的轻微的计数不足),但是你可以将用户代理添加到id哈希中,或者生成随机令牌并将其放入cookie中,但这需要cookie存储和对每个请求进行读/写。这将为我们树立榜样。伟大的人!非常感谢,散列用户代理是一种特殊的散列。如何检测机器人和其他流量?“小心排除机器人、rss点击或其他你不关心的流量”是的,我找到了一种使用用户代理的方法。
var PurgeInterval = 5 * time.Minute
var identifiers = make(map[string]time.Time)
var mu sync.RWMutex
// Hash ip + ua for anonymity in our store
hasher := sha256.New()
hasher.Write([]byte(ip))
hasher.Write([]byte(ua))
id := base64.URLEncoding.EncodeToString(hasher.Sum(nil))

// Insert the entry with current time
mu.Lock()
identifiers[id] = time.Now()
mu.Unlock()
// Clear the cache at intervals
mu.Lock()
for k, v := range identifiers {
    purgeTime := time.Now().Add(-PurgeInterval)
    if v.Before(purgeTime) {
        delete(identifiers, k)
    }
}
mu.Unlock()