采用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地址在一天内只允许评价他一次,基本实现

 

 

posted @ 2011-09-04 18:50  路-人-甲  阅读(341)  评论(0编辑  收藏  举报
[路-人-甲] 虽然努力不一定会有好成果,但不努力一定不会有好成果...