3

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

<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"] 的三个点击,这三次都是空的,而我应该明白它是同一个用户(第一次点击:新访客,第二次和第三次点击:回访者总共有一位访客/用户)。任何想法如何解决这一问题?

4

4 回答 4

2

一个非常有趣的问题!

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

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

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

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

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

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

如果您真的非常需要每个用户的单一身份 - 一个无法通过多个同时请求等绕过或意外踩到的身份 - 那么您唯一的解决方案是要求用户通过嵌入的值在他们的第一个请求中明确标识自己在 POST 或 GET 查询或在先前访问期间创建的 cookie 中。

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

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

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

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

于 2012-10-31T20:16:11.193 回答
1

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

于 2012-11-03T09:14:50.900 回答
0

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

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

是的,该解决方案并不完美,但它比 cookie 解决方案要好。

于 2012-10-25T10:49:13.640 回答
0

不要使用 iframe,使用母版页。创建一个母版页,并将此代码放在“mypage.aspx”的顶部

<%@ Page Language="C#" MasterPageFile="~/Site1.Master" ...
于 2012-11-04T14:18:18.143 回答