本程序采用.net平台和mysql数据库实现
mysql数据库中表:
CREATE TABLE `web_statistics` ( `id` int(10) unsigned NOT NULL auto_increment, `Cur_url` varchar(500) NOT NULL, `Pre_url` varchar(500) NOT NULL default '未知', `Os` varchar(50) NOT NULL default '未知', `Ip` varchar(15) NOT NULL, `Browser` varchar(50) NOT NULL default '未知', `Access_Time` datetime NOT NULL, `Host_Name` varchar(45) NOT NULL default '未知', PRIMARY KEY (`id`) )
mysql存储过程:
CREATE PROCEDURE `proc_statistics`(Cur_url varchar(500),Pre_url varchar(500),Os varchar(50),Brows varchar(50),Host_Name varchar(45),Ip varchar(15)) begin insert into web_statistics(Cur_url,Pre_url,Os,Ip,Browser,Access_Time,Host_Name) values(Cur_url,Pre_url,Os,Ip,Brows,now(),Host_Name); end
ashx执行平台代码:
using System; using System.Web; using MySql.Data; using MySql.Data.MySqlClient; using MySql.Data.Types; using System.Data; public class Statistics : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "image/jpg"; string url_cur = "加载当前Url错误"; string url_pre = "直接访问"; if (context.Request.QueryString["d"] != null) { url_pre = System.Web.HttpContext.Current.Server.UrlDecode(context.Request.QueryString["d"].ToString()).Replace("`","&"); if (url_pre == "") { url_pre = "直接访问"; } } if (context.Request.QueryString["u"] != null) { url_cur = System.Web.HttpContext.Current.Server.UrlDecode(context.Request.QueryString["u"].ToString()).Replace("`", "&"); } string[] data = GetData(); string con_mysql = System.Configuration.ConfigurationManager.ConnectionStrings["mysql"].ToString(); MySqlConnection conn; MySqlCommand cmd ; try { conn = new MySqlConnection(con_mysql); conn.Open(); cmd = new MySqlCommand(); cmd.Connection = conn; //存储过程实现 cmd.CommandText = "proc_statistics"; cmd.CommandType = CommandType.StoredProcedure; MySqlParameter para1 = new MySqlParameter("Cur_url", MySqlDbType.VarChar, 500); MySqlParameter para2 = new MySqlParameter("Pre_url", MySqlDbType.VarChar, 500); MySqlParameter para3 = new MySqlParameter("Os", MySqlDbType.VarChar, 50); MySqlParameter para4 = new MySqlParameter("Ip", MySqlDbType.VarChar, 15); MySqlParameter para5 = new MySqlParameter("Brows", MySqlDbType.VarChar, 50); MySqlParameter para7 = new MySqlParameter("Host_Name", MySqlDbType.VarChar, 45); para1.Value = url_cur; para2.Value = url_pre; para3.Value = data[1]; para4.Value = data[3]; para5.Value = data[2]; para7.Value = data[0]; cmd.Parameters.Add(para1); cmd.Parameters.Add(para2); cmd.Parameters.Add(para3); cmd.Parameters.Add(para4); cmd.Parameters.Add(para5); cmd.Parameters.Add(para7); //参数实现 /* cmd.CommandType = CommandType.Text; //直接拼接字符串实现 //string sql = "insert into web_statistics(Cur_url,Pre_url,Os,Ip,Browser,Access_Time,Host_Name)values('"+url_cur+"','"+url_pre+"','"+data[1]+"','"+data[3]+"','"+data[2]+"',now(),'"+data[0]+"')"; //sql语句参数实现 string sql = "insert into web_statistics(Cur_url,Pre_url,Os,Ip,Browser,Access_Time,Host_Name)values(?Cur_url,?Pre_url,?Os,?Ip,?Brows,now(),?Host_Name)"; cmd.CommandText = sql; MySqlParameter para1 = new MySqlParameter("?Cur_url", MySqlDbType.VarChar,500); MySqlParameter para2 = new MySqlParameter("?Pre_url", MySqlDbType.VarChar, 500); MySqlParameter para3 = new MySqlParameter("?Os", MySqlDbType.VarChar, 50); MySqlParameter para4 = new MySqlParameter("?Ip", MySqlDbType.VarChar, 15); MySqlParameter para5 = new MySqlParameter("?Brows", MySqlDbType.VarChar, 50); MySqlParameter para7 = new MySqlParameter("?Host_Name", MySqlDbType.VarChar, 45); para1.Value = url_cur; para2.Value = url_pre; para3.Value = data[1]; para4.Value = data[3]; para5.Value=data[2]; para7.Value = data[0]; cmd.Parameters.Add(para1); cmd.Parameters.Add(para2); cmd.Parameters.Add(para3); cmd.Parameters.Add(para4); cmd.Parameters.Add(para5); cmd.Parameters.Add(para7); */ cmd.ExecuteNonQuery(); cmd.Dispose(); conn.Close(); } catch {} //输入图片 string img_name = "statistics.jpg"; //直接输出图片 // context.Response.WriteFile(context.Server.MapPath(img_name)); //缓冲输出图片 byte[] datas; if (HttpContext.Current.Cache["datacache"] != null) { datas = (byte[])HttpContext.Current.Cache["datacache"]; } else { //记得修改文件图片名称 datas = System.IO.File.ReadAllBytes(context.Server.MapPath(img_name)); HttpContext.Current.Cache.Insert("datacache", datas, null, DateTime.MaxValue, TimeSpan.FromHours(12)); } context.Response.OutputStream.Write(datas, 0, datas.Length); } public string[] GetData() { string[] data = new string[4]; string userAgent = System.Web.HttpContext.Current.Request.UserAgent == null ? "无" : System.Web.HttpContext.Current.Request.UserAgent; data[0] = System.Web.HttpContext.Current.Request.ServerVariables.Get("Remote_Host").ToString(); //主机名(暂时有问题) data[1] = System.Web.HttpContext.Current.Request.Browser.Platform.ToString() + ":" + GetOSNameByUserAgent(userAgent);//操作系统 data[2] = System.Web.HttpContext.Current.Request.Browser.Browser.ToString() + ":" + System.Web.HttpContext.Current.Request.Browser.Version.ToString();//浏览器名称和版本 string result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (null == result || result == String.Empty) { result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; } if (null == result || result == String.Empty) { result = HttpContext.Current.Request.UserHostAddress; } data[3] = result;//ip地址 return data; } private string GetOSNameByUserAgent(string userAgent) { string osVersion = "未知"; if (userAgent.Contains("NT 6.1")) { osVersion = "Windows 7/Server 2008 R2"; } else if (userAgent.Contains("NT 5.2")) { osVersion = "Windows Server 2003"; } else if (userAgent.Contains("NT 5.1")) { osVersion = "Windows XP"; } else if (userAgent.Contains("NT 6.0")) { osVersion = "Windows Vista/Server 2008"; } else if (userAgent.Contains("NT 5")) { osVersion = "Windows 2000"; } else if (userAgent.Contains("Linux")) { osVersion = "Linux"; } else if (userAgent.Contains("NT 4")) { osVersion = "Windows NT4"; } else if (userAgent.Contains("Me")) { osVersion = "Windows Me"; } else if (userAgent.Contains("98")) { osVersion = "Windows 98"; } else if (userAgent.Contains("95")) { osVersion = "Windows 95"; } else if (userAgent.Contains("Mac")) { osVersion = "Mac"; } else if (userAgent.Contains("Unix")) { osVersion = "UNIX"; } else if (userAgent.Contains("SunOS")) { osVersion = "SunOS"; } return osVersion; } public bool IsReusable { get { return false; } } }
实现调用:
因为我把本程序部署在dag.wzu.edu.cn域名的服务器上,所以可以直接通过html+js代码就可以实现客户端的访问统计功能
<img style="width:0px;height:0px;border:0px" id="statistics_id_fei" /><script type="text/javascript"> window.onload = function () { document.getElementById("statistics_id_fei").src = "http://dag.wzu.edu.cn/statistics.ashx?d="+ encodeURI(document.referrer).replace('&', '`') + "&u=" + encodeURI(document.location.href).replace('&', '`') + "&x=" + Math.random(); }</script>
说明:
1、在执行文件ashx上,采用了多种可选方式,其中数据库方面有直接拼接sql,sql参数方法,存储过程调用三种方法;
2、为了能够是js中的onload事件能够执行,加载完ashx文件后,生成一个对应的图片文件,采用了直接加载cache缓存方式实现;
3、只要直接把这里的html和js代码复制到你网址的