V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
turing
V2EX  ›  Node.js

Etager 一个基于Etag的简易的tracker实现

  •  
  •   turing · 2013-09-13 17:12:39 +08:00 · 4791 次点击
    这是一个创建于 4089 天前的主题,其中的信息可能已经有所发展或是发生改变。


    通过Etag而不是cookie来追踪用户的访问有个好处,就是客户端不用部署js,省事儿。

    看图,可以看到:当用户第一次访问带有tracker.jpg这个假图片的网页时,后台会分配一个uuid给这个用户,当第二次访问任何其他带有这个图像的url的时候,由于返回了相同的Etag,浏览器会把这个请求设成304,不会从服务器端再下载任何内容(本身这个tracker.jpg就是0b的)

    所以,当这个用户清空他的浏览器缓存之前,我们可以一直非常低成本的追踪同一个用户的访问路径。是个非常有趣的尝试。~

    Github:
    https://github.com/turingou/etager
    12 条回复    1970-01-01 08:00:00 +08:00
    airyland
        1
    airyland  
       2013-09-13 18:48:08 +08:00
    支持一下。楼主又挖坑啦
    j1anb1n
        2
    j1anb1n  
       2013-09-14 01:05:04 +08:00
    是的,我们公司种UUID就是用这种方式
    pythonee
        3
    pythonee  
       2013-09-14 21:28:32 +08:00
    不是很懂这个流程,那你是怎么标识一个客户端的呢,怎么判断firstAccess的呢?这里tracker.jpg设成304的作用是什么呢
    turing
        4
    turing  
    OP
       2013-09-14 21:44:44 +08:00
    pythonee
        5
    pythonee  
       2013-09-14 22:33:04 +08:00
    哦,原来我之前没有注意过Etag啊
    wudikua
        6
    wudikua  
       2013-09-14 23:05:39 +08:00
    楼主我看了一下你发的那篇英文的文章,他其实讲的就是一种基于etag的session的实现,而不是基于cookie里面的session id,但是这个怎么追踪的用户访问路径啊?每次访问的都是/demo/tracker.jpg固定的链接,这里面都没包含用户的访问行为啊。如果是访问的/demo/url1和/demo/url1/tarcker.jpg,/demo/url2和/demo/url2/tracker.jpg 还可以理解。
    turing
        7
    turing  
    OP
       2013-09-15 00:23:24 +08:00
    @wudikua

    我的方法是在中间件中生成的时候加入from参数,比如访问/page/1 时生成 tracker.jpg?form=/page/1 ,第一次访问的时候记录这个uuid到session,然后每次访问就都知道是同一个用户了。
    tangzx
        8
    tangzx  
       2013-09-15 09:17:14 +08:00 via iPhone
    遇到长城宽带、网吧、办公室网络这样带transparent proxy的环境就挂了
    reorx
        9
    reorx  
       2013-09-15 11:22:01 +08:00
    楼主知否为何 Google Analytics 在用的是 1x1 的 gif 图而非 0 字节图片呢?我想是否可能是 0 字节图片不够”正规“,毕竟它不具备可显示性,可能被认为是错误的图片请求?
    turing
        10
    turing  
    OP
       2013-09-15 11:55:19 +08:00
    @reorx GA有用到这种方法吗?我还没注意过。。我默认写样式隐藏了,但对某些终端不太友好(或者会产生样式覆盖的问题),所以GA可能想放一个可以显示的图片吧~
    reorx
        11
    reorx  
       2013-09-15 12:35:09 +08:00
    GA 通过请求一个叫做 _utfm.gif 的 1x1 像素大小的图片进行 track,和楼主一样也是通过 url 的 query string 向服务器提交追踪数据。好处是避免了使用 js 发出 ajax 请求(同时规避了跨域请求的问题)。但是 GA 没有用 Etag 作为用户身份的凭证,而是把整个 cookie 都用 query string 传过去了。

    之前在 SA 上看过有人问为何用 gif,答曰 1x1 的 gif 是所有同样大小的图片类型中最小的,但没有人看到问为何不返回 0 字节的,所以我也只是猜想用 1x1 可能更好一些
    reorx
        12
    reorx  
       2013-09-15 12:36:23 +08:00
    @turing SO 打成 SA 了,大概是饿昏了……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1598 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:59 · PVG 00:59 · LAX 08:59 · JFK 11:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.