防止网站重复投票

利用Cookie对象防止重复投票


11.5  在线投票

在线投票系统为网民们参与网上投票活动提供了方便,提高了网民的参与积极性,同时也为网站管理人员提供了宝贵的数据。下面将通过几个实例介绍如何制作网上投票系统。

实例264  利用Cookie对象防止重复投票

实例说明

一些大中型企业,经常在网站的首页设立一项在线投票功能,以便能够及时地了解本企业的产品或客户服务在广大市民心中的地位。为了在投票系统中确保准确率,防止重复投票是一项必不可少的功能。本实例将介绍如何在投票系统中防止重复投票。如图11.18所示,网民可以单击【我要投票】按钮参与投票,如果已投过票,系统将会弹出图11.9所示的对话框,并提醒已投票。如果单击【查看投票结果】按钮,将会看到图11.20所示的投票统计结果。

 
图11.18  网站调查
  
图11.9  提示对话框
  
图11.20  投票结果

技术要点

Cookie提供了一种在Web应用程序中存储用户特定信息的方法。如利用Cookie存储用户登录的IP地址,只要用户在Cookie的有效期内登录网站,网站就可以识别该用户的身份。本实例就是利用这个特性,自定义Cookie对象来防止网民们重复投票。下面介绍Cookie对象的用途和常用属性。

由于Cookie与Web站点直接关联,因此只要用户发出浏览此Web站点中页面的请求,浏览器就会和服务器交换Cookie信息。Cookie对象不隶属于Page对象,而分别隶属于Request对象和Response对象,每一个Cookie变量都被不同的Cookie对象所管理。

Cookie对象完整的类别名称是HttpCookieCollection。

如果保存一个Cookie变量,需要使用Response对象的Cookies集合,语法如下:


Response.Cookies["变量名"].Value="表达式"

如果读取一个Cookie变量,需要使用Request对象的Cookies集合,语法如下:

username=Request.Cookies["变量名"].Value

Cookies对象最常用的属性有以下几种。
  
Expires属性:设定Cookie变量的有效时间,默认1000分钟,若设为0则可以实时删除Cookie变量。
  
Name属性:Cookie变量的名称。
  
Value属性:Cookie变量的值。

实现过程

(1)新建一个网站,命名为Ex11_12,默认主页名为Default.aspx。

(2)在页Default.aspx中添加1个Table表格,用来布局页面。在该Table表格上添加1个RadioButtonList控件,以供用户选择投票,再添加2个Button控件,分别用于执行投票和查询投票结果。

(3)创建1个新页Result.aspx,用于显示投票结果。在该页中添加1个GridView控件用于显示投票结果。

(4)主要程序代码。

在页面Default.aspx中,用户单击【我要投票】按扭后,首先判断用户是否已投过票,如果用户已投票,则弹出对话框提示用户;如果用户是第一次投票,则利用Cookie对象保存用户的IP地址,并弹出对话框提示用户投票成功。其代码如下:

//进行投票
protected void Button1_Click(object sender, EventArgs e)
{
//判断指定的IP是否已投过票了,如果已经投过了,则弹出提示对话框
string UserIP = Request.UserHostAddress.ToString( );
int VoteID = Convert.ToInt32(RadioButtonList1.
SelectedIndex.ToString( ))+1;
HttpCookie oldCookie=Request.Cookies["userIP"];
if (oldCookie == null)
{
UpdateVote(VoteID);
Response.Write("<script>alert('投票成功,
谢谢您的参与!')</script>");
//定义新的Cookie对象
HttpCookie newCookie = new HttpCookie("userIP");
newCookie.Expires = DateTime.MaxValue ;
//添加新的Cookie变量IPaddress,值为UserIP
newCookie.Values.Add("IPaddress", UserIP);
//将变量写入Cookie文件中
Response.AppendCookie(newCookie);
return;
}
else
{
string userIP = oldCookie.Values["IPaddress"];
if (UserIP.Trim( ) == userIP.Trim( ))
{
Response.Write("<script>alert('一个IP地址
只能投一次票,谢谢您的参与!');history.go(-1);</script>");
return;
}
else
{
HttpCookie newCookie = new HttpCookie("userIP");
newCookie.Values.Add("IPaddress", UserIP);
newCookie.Expires = DateTime.MaxValue ;
Response.AppendCookie(newCookie);
UpdateVote(VoteID);
Response.Write("<script>alert('投票成功,
谢谢您的参与!')</script>");
return;
}
}
}

为了使投票结果更直观,在显示投票结果页Result.aspx中,将投票结果以百分比的形式显示在页面上。实现此功能,需要将页Result.aspx切换到HTML视图中,并将自定义方法FormatVoteCount(string voteCount)绑定在显示框的百分比列中。其代码如下:

<asp:TemplateField HeaderText ="所占总票的百分比" >
<ItemTemplate>
<%#FormatVoteCount(DataBinder.Eval(Container.DataItem,
"NumVote").ToString ( ))%>%
</ItemTemplate>
</asp:TemplateField>

当投票结果显示框绑定时,使用自定义方法FormatVoteCount(string voteCount),将百分比列显示在界面中。其代码如下:

public int FormatVoteCount(string voteCount)
{
int total = TotalNum( );
//如果投票没有被投票
if (voteCount.Length <= 0)
{
//返回0个百分比
return(0);

}
if (total > 0)
{
//返回实际的百分比
return (int.Parse(voteCount)*100/total);
}
return (0);

}

举一反三

根据本实例,读者可以:

开发只允许内部人投票;

开发只允许某一行业的人员投票。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值