关于网站访问来源跟踪问题,如google、51.la和cnzz等网站都提供专业的流量统计工具,只需要在网站上放一段JavaScript脚本就可以,非常简单实用。最近有个项目需要记录登录用户的行为,看了几个流量统计网站,都没有提供这方面的支持。实在没有办法,看来只能自己来做了。
方案1
查看HttpRequest类的属性,其中有个属性UrlReferrer可以获取有关客户端上次请求的 URL 的信息,这个也就是我们需要的访问来源信息了。只要在每个页面的Load事件中写入访问来源日志就可以了。缺点,每个页面都需要写事件代码。
方案2
使用IHttpModule接口
public class HttpModule : System.Web.IHttpModule
{
public void Init(HttpApplication context)
{
//建立个委托让他执行下面的ReUrl_BeginRequest事件
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
}
public void Dispose()
{
}
private void ReUrl_BeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
HttpRequest request = context.Request;
string user = context.User.Identity.Name;
//记录日志,根据request.UrlReferrer获取访问来源
}
}
IHttpModule需要在Web.config配置文件中配置后才可以启用(配置方法可以参考MSDN上的例子)。优点,这样的好处是不改变以前写的代码,可以随便拆离和修改。缺点,在使用的时候时候发现会将一些css和图片等信息的访问日志都记录下来了,这些是我们不需要的,需要使用对访问的url进行过滤,随着网站功能的扩展,需要过滤的信息也越来越多容易遗漏。
方案3
使用JavaScript+IHttpHandler
首先写个HttpHandler来处理信息的记录。使用JavaScript/AJAX来处理信息的提交。
public class ReferrerHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
if (!SiteConfiguration.Debug)
{
string urlReferrer = context.Request.QueryString["referrer"];
string requestUrl = context.Request.UrlReferrer.ToString();
string userName = string.Empty;
if (context.User != null)
{
userName = context.User.Identity.Name;
}
string ipAdress = context.Request.UserHostAddress;
//访问来源日志记录
}
}
}
在需要记录的页面增加下面代码。
<script type="text/javascript" src="Scripts/mainscript.js">
</script>
技巧:可以将下面引用添加到母板中,只要继承该母板的页面都会记录。
最后剩下的就是mainscript.js脚本的编写了。
/// <mainscript.js/>
var referrer = document.referrer;
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function startRequest() {
createXMLHttpRequest();
var url = "/ReferrerHandler.ashx?referrer=" + encodeURIComponent(referrer);
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}
startRequest();
使用Ajax进行提交请求。需要注意encodeURIComponent函数,如果省略掉访问来源地址有多个参数的时候,只会记录一个参数。