本程序采用.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代码复制到你网址的
直接的任何地方就可以实现自己站点的访问量统计。