首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

怎样做文章系统中的防刷新计数器?该怎么处理

2012-03-01 
怎样做文章系统中的防刷新计数器?普通的计数器防刷新,方法较多。如果是文章系统,每篇文章的阅览人数都有统

怎样做文章系统中的防刷新计数器?
普通的计数器防刷新,方法较多。
如果是文章系统,每篇文章的阅览人数都有统计,这个怎样防止刷新计数?
在用户的session期内,两篇文章,每篇文章都要加1。看同一篇文章,看多少遍都只加1次。
这个该怎么实现呢?

[解决办法]
根据IP和时间来决定是否计数,总数会少一些,因为共用一个IP的按照一个IP计数。


12:00:00 222.123.123.25看了一次 计数

通过服务器对象application也可以
[解决办法]
一个用户看过的文章的ID,可以放一个Session变量中
刷新计数时,检查这个用户是否看过。
[解决办法]
防刷新的话用ajax了
[解决办法]

探讨
防刷新的话用ajax了

[解决办法]

Global.asax
C# code
void Application_Start(object sender, EventArgs e)     {        // 在应用程序启动时运行的代码        int count = 0;        int day_count = 0;        int year = 0;        int month = 0;        int day = 0;        DateTime today = DateTime.Now;        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["lianxiConnectionString"].ConnectionString);        conn.Open();        SqlDataAdapter sda1 = new SqlDataAdapter("select [count] from [webcount]",conn);        DataSet ds = new DataSet();        sda1.Fill(ds);                //取总访问数        if (ds.Tables[0].Rows.Count > 0)        {            DataRow dr = ds.Tables[0].Rows[0];            count = Convert.ToInt32(dr["count"].ToString());        }        ds.Clear();        SqlDataAdapter sda2 = new SqlDataAdapter("select * from [day_count]",conn);        sda2.Fill(ds);        //取每天访问数        if (ds.Tables[0].Rows.Count > 0)        {            DataRow dr = ds.Tables[0].Rows[0];            day_count = Convert.ToInt32(dr["day_count"].ToString());            year = Convert.ToInt32(dr["year"].ToString());            month = Convert.ToInt32(dr["month"].ToString());            day = Convert.ToInt32(dr["day"].ToString());        }        //日期不同,则day_count为0        if (today.Year != year || today.Month != month || today.Day != day)            day_count = 0;        Application["count"] = count;        Application["day_count"] = day_count;    }        void Application_End(object sender, EventArgs e)     {        //  在应用程序关闭时运行的代码    }            void Application_Error(object sender, EventArgs e)     {         // 在出现未处理的错误时运行的代码    }    void Session_Start(object sender, EventArgs e)     {        // 在新会话启动时运行的代码        Application.Lock();//锁定Application        int count = 0;        int day_count = 0;        int year = 0;        int month = 0;        int day = 0;        DateTime today = DateTime.Now;        year = today.Year;        month = today.Month;        day = today.Day;        //访问次数都加1        count = (int)Application["count"];        day_count=(int)Application["day_count"];        count++;        day_count++;        Application["count"] = count;        Application["day_count"] = day_count;        //更新数据库        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["lianxiConnectionString"].ConnectionString);        conn.Open();        SqlCommand cmd1 = new SqlCommand("update [webcount] set [count]='"+count+"'",conn);        cmd1.ExecuteNonQuery();        SqlCommand cmd2 = new SqlCommand("update [day_count] set [day_count]='"+day_count+"',[year]='"+year+"',[month]='"+month+"',[day]='"+day+"'",conn);        cmd2.ExecuteNonQuery();        Application.UnLock();//解锁    }    void Session_End(object sender, EventArgs e)     {        // 在会话结束时运行的代码。         // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer         // 或 SQLServer,则不会引发该事件。    } 


[解决办法]
建议还是将加1的工作放到Session_End里面,前面只记录是否看过文章,可不记录看过多少次
这样只有在Session结束的时候加1
[解决办法]
关注,
[解决办法]

C# code
        if (Request.Cookies["nb" + Request.QueryString["id"].ToString()].Value == null)        {            //计数        }        else        {            Request.Cookies["nb" + Request.QueryString["id"].ToString()].Value = "随便写个串";        }
[解决办法]
完全没有必要这样做,又不是搞投票!人气越高越好!
[解决办法]
限制IP和时间
[解决办法]
数据库里存一张sessionid和该sessionid已经访问过的文章id的表,更新时判断一下sessionid和articleid是否已存在,已存在就不更新
[解决办法]
限制IP,时间,主机头三个基本上就OK了
[解决办法]
ip+cookie+useragent
[解决办法]
你把说明说详细些比较好解决啊,你觉得用session耗内存的话,你可以用张表专门记载当天访问的IP和文章的ID,然后每次刷新时,查下表里面有没有这个IP,没有的话count就加1,有的话就不加,在写个触发器每天十二点清空表就好啦,只是这样会减慢速度。这里你可以把验证ip的工作发到另一个页面去处理,这样让用户不至于加长加载时间。

热点排行