通过同时访问检测唯一身份用户

时间:2012-10-25 10:28:22

标签: asp.net .net google-analytics

想象一个简单的html页面,其中3个iframe指向同一个网址:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <iframe src="http://www.mydom.com/mypage.aspx"></iframe>
    <iframe src="http://www.mydom.com/mypage.aspx"></iframe>
    <iframe src="http://www.mydom.com/mypage.aspx"></iframe>
</body>
</html>

我的目标是跟踪mypage.aspx代码中的唯一身份访问者。听起来很简单但有以下几点:

if (Request.Cookies["myc"] == null)
{
    // New visitor!
    Response.Cookies["myc"].Value = myval;
    Response.Cookies["myc"].Expires = DateTime.Now.AddYears(10);
}
else
{
    // Returning visitor
}

有问题。访问带有3个iframe的html页面我得到三个同时命中mypage.aspx和Request.Cookies [“myc”]三次都是null,而我应该明白它是同一个用户(第一击:新访客,第二和第3次点击:返回访客总共一位访客/用户)。任何想法如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

一个非常有趣的问题!

核心问题是互联网是一个异步,匿名的地方。

浏览器可以一次提交其中一个请求,或同时提交所有三个请求,因此无法控制用户计算机上的事件顺序。

此外,浏览器不会做出任何特别的努力来唯一地识别用户。任何识别系统都必须安装在请求/响应周期中。 GA使用cookie来标记用户,并可以随每个请求提取该信息。从本质上讲,GA会在用户访问您的网站之前对其进行标记,从而允许该服务在“第一次”点击时识别用户。

您的问题是您想要实施自己的识别解决方案。您需要以某种方式在请求中包含用户的身份。但是,在他们访问该网站之前,您无法做到这一点。并且,鉴于每个同时请求将在响应中嵌入不同的标识,您无法保证用户将被标记为单个标识。

基本上,据我所知,没有任何解决方案可以让您的网站自动识别匿名用户。

您可能很想使用IP地址,但在某些情况下可以使用,但这是一个非常糟糕的解决方案。现在我在雇主防火墙后面。如果您使用当前可见的IP地址来识别我,您会看到我和其他5,000名在这里作为单个用户工作的人。这是一个非常危险的系统。

如果你真的,真的需要为每个用户提供一个身份 - 一个不能通过多个同时请求被绕过或意外踩踏的用户 - 那么你唯一的解决方案就是要求用户通过他们的第一个请求明确表明自己POST或GET查询中嵌入的值或上次访问期间创建的cookie。

在您的方案中,所有三个响应都可以生成具有唯一ID的cookie(连续三个ID,每个ID都覆盖以前的值)。登录页面可以是通用的“欢迎访问我的网站”页面,或类似的东西。然后,用户可以单击链接以访问该站点,此时最后生成的cookie(具有最后生成的id)将嵌入到请求中。虽然您无法保证每个用户只能生成一个ID,但您至少可以相信,在第一轮请求之后(以及在访问您网站的主要内容部分之前),它们将由一个ID标识。

当然,您可以使用复杂的AJAX解决方案,其中未识别用户的响应本质上是一个容器(没有ID)。然后,AJAX可以在cookie中设置一个标志,指示它正在检索ID,然后它可以提交第一个请求。后续的AJAX容器将看到此cookie,然后进入轮询状态,等待标志被清除。当第一个响应返回时,第一个AJAX容器可以在cookie中设置ID并更改标志。然后,剩下的容器将检测到标志更改,并可以从cookie中检索ID(而不是发送自己的请求)。

一旦AJAX容器具有ID,它就可以发送内容请求以及唯一ID。然后,您的站点可以响应,使用适当的数据填充容器(或者只是重定向到相应的页面)。

如果正确实施此解决方案,或多或少会保证仅为用户分配一个ID。但是真的,这值得吗?请记住,cookie和请求“属于”用户。用户可以很容易地编辑两者。虽然有一些技术可以检测已编辑的身份(大多数涉及某种形式的加密),但如果他们愿意,您无法阻止用户“匿名”自己。有时中途解决方案就足够了。

答案 1 :(得分:1)

您所要做的就是将相同的代码放在[webMethod]而不是PageLoad中,然后通过js(XMLHttpRequest)从客户端调用[WebMethod],您将按顺序接收这三个调用。由于同时命中,不再有probs。

答案 2 :(得分:0)

这很有道理。所有这些请求在第一次没有任何cookie,因此在所有情况下都将为null。请记住,它应该尽可能地保持异步,它必然是线性的(可能是,我不是流量的专家)。

相反,请查看IP地址和时间戳。如果它是相同的,您可以像是同一个用户一样工作。

是的,这个解决方案并不完美,但它比cookie解决方案更好。

答案 3 :(得分:0)

请勿使用iframe,使用母版页。创建母版页,并将此代码放在“mypage.aspx”

的顶部
<%@ Page Language="C#" MasterPageFile="~/Site1.Master" ...