采用cookie实现文章顶/踩
最近在做一个小项目,其中有个关于文章的顶/踩的实现,之前也没做过类似的案例。在网上找了半天,没有多大收获,于是乎决定按照自己的想法去做一个简单的例子,没想到成功了,呵呵,其实在下也不过是一菜鸟,拿出来与大家分享,其中不免会有漏洞,望大家见谅,也希望高手们多多指教。谢了
第一步,创建一个aspx页面--testMyCookie.aspx,页面代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="testMyCookie.aspx.cs" Inherits="testMyCookie" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>测试cookie|简单的实现文章根据IP地址在规定时间内顶和踩受限</title> </head> <body> <form id="form1" runat="server"> <div> <a href="testMyCookie.aspx?id=1">传递的参数id的参数值为1</a> <a href="testMyCookie.aspx?id=2">传递的参数id的参数值为2</a> <a href="testMyCookie.aspx?id=3">传递的参数id的参数值为3</a> <a href="testMyCookie.aspx?id=4">传递的参数id的参数值为4</a> <br /><br /> <a href="testMyCookie.aspx?id=5">传递的参数id的参数值为5</a> <a href="testMyCookie.aspx?id=6">传递的参数id的参数值为6</a> <a href="testMyCookie.aspx?id=7">传递的参数id的参数值为7</a> <a href="testMyCookie.aspx?id=88">传递的参数id的参数值为88</a> <br /><br /> <a href="testMyCookie.aspx?id=100">传递的参数id的参数值为100</a> <a href="testMyCookie.aspx?id=101">传递的参数id的参数值为101</a> <a href="testMyCookie.aspx?id=10">传递的参数id的参数值为10</a> <a href="testMyCookie.aspx?id=1">传递的参数id的参数值为1(重)</a> <br /><br /> 当前获取到的参数id是<asp:TextBox ID="TextBox1" runat="server" Width="478px"></asp:TextBox><br /> 当前的IP地址是:<asp:TextBox ID="TextBox2" runat="server" Width="507px"></asp:TextBox><br /> 处理后的IP地址是:<asp:TextBox ID="TextBox3" runat="server" Width="491px"></asp:TextBox><br /> 当前的cookie信息如下:<br /> <asp:TextBox ID="TextBox4" runat="server" Height="73px" Width="633px"></asp:TextBox><br /><br /> <asp:Button ID="Button1" runat="server" Text="删除cookie" onclick="Button1_Click" /> </div> <asp:Literal ID="Literal1" runat="server"></asp:Literal> </form> </body> </html>
第二步,testMyCookie.aspx--testMyCookie.aspx.cs的后台代码如下:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; public partial class testMyCookie : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { this.Literal1.Text = "";//清空提示信息 load();//首次加载,每次点击本页面的超链接也会执行该方法 } } /// <summary> /// 删除cookie /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Button1_Click(object sender, EventArgs e) { this.Literal1.Text = "";//清空提示信息 HttpCookie myCookie = Request.Cookies["GoodAndBad"]; if (myCookie != null) { myCookie.Expires = DateTime.Now.AddMilliseconds(0.0001);//1毫秒后失效 Response.Cookies.Add(myCookie); HttpCookie myCookie2 = Request.Cookies["GoodAndBad"]; this.TextBox4.Text = "当前的cookie值:" + myCookie2.Value.ToString();//文本框显示当前cook的value信息 } } /// <summary> /// /// </summary> public void load() { # region 逻辑代码 //实现思路--将传递过的的参数值和本机IP地址拼成一个有规律的字符串, //然后每次拼该字符串之前要做一次判断, //看看需要添加进来的字符串(参数值)是否已存在该字符串中, //若存在,说明已经执行过该操作了,下一步当然是给出提示了,从而满足我们的需要 //其中省略了连接数据库后台判断等一些步骤. //不过既然是搞程序开发的,相信那些不用我说大家也知道应该在哪里添加判断,呵呵 string id = "";//声明变量,存储参数id的值 string newchar = "";//声明中间变量,存储id和IP拼成的字符串 string user_IP = "127.0.0.7";//假设您的IP是127.0.0.7 //获取客户端IP if (Request.ServerVariables["HTTP_VIA"] != null) { user_IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); } else { user_IP = Request.ServerVariables["REMOTE_ADDR"].ToString(); } //文本框显示信息 this.TextBox2.Text = "本机的IP地址是:" + user_IP; //将IP地址转成我们想要的字符串格式 user_IP = user_IP.Replace(".", "|"); this.TextBox3.Text = "处理后的地址是:" + user_IP; //接收参数id,一定要加异常处理,因为首次加载的时候cd=null,这里也可以改代码 try { id = Request.QueryString["id"].ToString() + "|"; } catch (Exception) { //id = "0|"; //throw; } //获取或创建cookie(获取和创建其实是一样的,就跟会话一样的) HttpCookie myCookie = Request.Cookies["GoodAndBad"]; //判断获取到的cookie if (myCookie == null)//如果cookie还没被创建 { //开始创建cookie myCookie = new HttpCookie("GoodAndBad"); newchar = user_IP;//拼字符串,本来应该写成newchar = id+user_IP,但是如果是第一次进来,id=null myCookie.Value = newchar;//给我们定义的cookie赋值,这一步很重要,不能少 //myCookie.Name = "a";这个属性不需要,在例子中若加上就会有问题 //设置过期时间为一天(这里可以修改参数,根据你的需求来定吧) myCookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(myCookie);//创建新对象并将其添加到 Cookies 集合(这句话不可少) } else { //拼字符串-->新字符串 = 处理过的参数值 + 以前的cookie的值(Value属性值)-->注意不是Values newchar = id + myCookie.Value; //判断处理过的参数值是否已存在cookie中 int panduannum = newchar.IndexOf("|" + id); //如果该参数值已存在,说明一执行过该操作(比如说已顶或踩过某篇文章) if (panduannum >= 0) { //输出前台提示信息 this.Literal1.Text = "<script>alert('已经评价过该文章!感谢您的参与!');</script>"; } else { ////拼字符串-->新字符串 = 处理过的参数值 + 以前的cookie的值(Value属性值)-->注意不是Values //newchar = id + myCookie.Value; //这里可以与数据库做交互了,比如实现文章或电影的好评与差评 //....................... //输出前台提示信息 this.Literal1.Text = "<script>alert('评价成功了!感谢您的参与!');</script>"; myCookie.Value = newchar;//给我们定义的cookie赋值,这一步很重要,不能少 //myCookie.Name = "a";这个属性不需要,在例子中若加上就会有问题 myCookie.Expires = DateTime.Now.AddDays(1);//一天过期(时间可以根据需求设置) Response.Cookies.Add(myCookie);//创建新对象并将其添加到 Cookies 集合(这句话不可少) } } this.TextBox4.Text = "当前的cookie值:" + myCookie.Value.ToString();//文本框显示当前cook的value信息 # endregion } }
第三步,新建一个项目,把以上代码copy到项目中运行就能看到效果了
截图1:第一次点击"传递的参数id的参数值为1"
截图2:再次点击"传递的参数id的参数值为1"
同一篇文章,一个IP地址在一天内只允许评价他一次,基本实现