Cookie是ASP中的一个对象集合,它以加密的形式被保存在客户端特定文件夹内,用户可以修改、删除甚至伪造Cookie;而Session是一个服务器对象,它被保存在服务器,所以相对地,使用Session较为安全,但较耗费服务器资源。你可以随意设置Cookie的生存期,例如1年。但如果你让一个Session变量始终生存在服务器主机内,对你的服务器来说并不是一个好的选择,通常来讲,涉及到“管理权限”的时候才会用Cookie+Session双认证。
ASP.NET中与Cookie密切相关的一些方法:
1. 如何建立Cookie:ASP.NET建立Cookie的标准代码写法是
HttpCookie myCookie = new HttpCookie("someCookie");
这句代码建立了一个名为myCookie的Cookie对象
2. 接收Cookie对象:接收ASP.NETCookie对象的标准代码写法是
HttpCookie getCookie = Request.Cookies["someCookie"];
设置getCookie为一个Cookie对象,它是请求页面中Cookie对象数组中someCookie的子集。如果名为someCookie的Cookie数组不存在,则getCookie的null属性为true。
3. 给Cookie增加键值:ASP.NET增加键值的标准代码写法是
myCookie.Values.Add("auth", "1");
给名为myCookie的Cookie对象(必须实现建好)增加一个auth键名,其值为1。
4. 附加键值,使Cookie生效:标准代码格式为
Response.Cookies.Add(myCookie);
上句代码把名为myCookie的对象附加到Cookie数组内。注意,在设定Cookie完毕之后一定要加上这句代码才能生效,
5. 设定生存期:设置生存期的标准代码形式如下
myCookie.Expires = DateTime.Now.AddDays(3);
设定名为myCookie的Cookie对象生存期为当前时间加上3天。需要注意的是,设定Cookie之后如果页面不刷新,是不会显示任何效果的。
6. 获取Cookie的值:获取Cookie值的标准代码格式为
myCookie.Values["auth"];
上句代码可以获取名为myCookie的Cookie对象键名为auth的键值。如果不存在,则返回null。
在vs中新建一个Cookie.aspx页。
下面是Cookie.aspx页的代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Cookie.aspx.cs" Inherits="Cookie" %>
<!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>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Panel ID="myPanel" runat="server">
用户名:
<asp:TextBox ID="myUID" runat="server"></asp:TextBox><br />
密 码:
<asp:TextBox ID="myPWD" runat="server"></asp:TextBox><br />
<asp:DropDownList ID="myDDL" runat="server">
<asp:ListItem Selected="True" Value="no">不保存</asp:ListItem>
<asp:ListItem Value="oneday">一天</asp:ListItem>
<asp:ListItem Value="oneweek">一周</asp:ListItem>
<asp:ListItem Value="onemonth">一个月</asp:ListItem>
</asp:DropDownList>
<br />
<asp:Button ID="myBtn" runat="server" Text="提交" />
</asp:Panel>
<br />
<asp:LinkButton ID="myLB" runat="server" Text="退出系统" OnClick="myLB_Click"> </asp:LinkButton>
</div>
</form>
</body>
</html>
这是Cookie.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;
/*--------------------------------------------------------------------------------------------------------------------------------
下句也是软件自动生成的代码,默认情况下,你的.aspx的前缀叫什么名,就引用逻辑文件的什么类,本例Cookie.aspx即引用Cookie类,冒号代表左边是右边的子类。本例中Cookie类属于System.Web.UI.Page的子类。
---------------------------------------------------------------------------------------------------------------------------------*/
public partial class Cookie : System.Web.UI.Page
{
/*--------------------------------------------------------------------------------------------------------------------------------
因为我们要接收用户名、密码、Cookie生存期的值,所以必须事先声明变量。我们分别声明了两个“string”字符串类型变量:uid和pwd和int整形变量exp_time。为了防止浏览器读取可恶的缓存,我们还要声明一个随机数作为URL地址后面的随机参数。
---------------------------------------------------------------------------------------------------------------------------------*/
private string uid;
private string pwd;
public int exp_time;
Random r=new Random();
/*-----------------------------------------------------------------------------------------------------------------
下句为Visual Studio 2008 软件自动生成的代码,前边我们提到过Page_Load是一个触发事件,即“当页面被加载”。它在当页面文件第一句AutoEventWireup为true时可以被逻辑文件使用。一旦我们需要有在页面加载时初始化的设置时统统可以写在这个代码块内。
------------------------------------------------------------------------------------------------------------------*/
protected void Page_Load(object sender, EventArgs e)
{
/*-----------------------------------------------------------------------------------------------------------------
以下前两句分别声明了两个HttpCookie类的实例:myCookie(用于存储Cookie)和Cookie(用于读取Cookie),someCookie是本例Cookie的名称。由于默认情况下浏览者是未登录的,所以根本谈不上退出系统,myLB组件的Visible(可见性)属性当然也要设置为false,以上是初始化代码。
------------------------------------------------------------------------------------------------------------------*/
HttpCookie myCookie=new HttpCookie("someCookie");
HttpCookie Cookie = Request.Cookies["someCookie"];
myLB.Visible = false;
if (!IsPostBack)
/*-----------------------------------------------------------------------------------------------------------------
注意:上面的代码比较常用,意为 “如果(不是 被POST方式提交的)”,它被用于判断本页面是否为被“POST”方法。如果本句返回“true”,则不是被“POST”请求方式提交的。
------------------------------------------------------------------------------------------------------------------*/
{
//如果本页Cookie对象不为空,则向下进行
if (Cookie!=null)
//如果本页Cookie对象名为auth的值为admin
{
if (Cookie.Values["auth"]=="1")
//返回登录信息,群组面板不可见,LinkButton组件可见
{
Response.Write("你已登录系统");
myPanel.Visible = false;
myLB.Visible = true;
}
}
else
{
//如果没有登录成功,则群组面板可见
myPanel.Visible = true;
}
}
else
//如果!IsPostBack的结果为false,即本页是POST请求过来的
{
//uid的变量的值为myUID输入的值
uid = Request.Form["myUID"];
//pwd变量的值为myPWD输入框的值
pwd = Request.Form["myPWD"];
/*---------------------------------------------------------------------------------------------------------------------------------
如果uid和pwd的值分别满足我们设定的值,则执行以下代码。注意:为了让新手理解思想,我在这里没有连接数据库取出用户“lau”的密码,而是直接赋值。
-------------------------------------------------------------------------------------------------------------------------------*/
if (uid=="1"&&pwd=="123")
{
//声明一个字符串变量exp,它被用做接收myDDL组件选择的生存期
string exp = myDDL.SelectedItem.Value;
//利用switch函数选择exp变量的值
switch (exp)
{
//如果用户选择的是第一项不保存,则exp_time的值为0
case "no":
exp_time = 0;break;
//如果用户选择的是第一项“一天”,则exp_time的值为1
case "oneday": exp_time = 1; break;
//如果用户选择的是第一项“一周”,则exp_time的值为7
case "oneweek": exp_time = 7; break;
//如果用户选择的是第一项“一个月”,则exp_time的值为30
case "onemonth": exp_time = 30; break;
//默认情况,如果都没有选,则exp_time的值为0
default: exp_time = 0; break;
}
//myCookie这个集合填加一个名为“auth”,值为“admin”的 Cookie
myCookie.Values.Add("auth", "1");
/*---------------------------------------------------------------------------------------------------------------------
如果“exp_time”的值“不为零”,则myCookie的生存期为从现在到增加的天数。注意:DataTime.Now方法可以返回当前时间,AddDays方法可以增加相应天数实际应用中你还可以使用其他方法使Cookie生存期精确到分和秒
--------------------------------------------------------------------------------------------------------------------*/
if (exp_time != 0)
{
myCookie.Expires = DateTime.Now.AddDays(exp_time);
}
/*--------------------------------------------------------------------------------------------------------------------
Response类的Cookies对象集合增加一个新的成员myCookie,注意:只有有这句代码,以上的Cookie设定才有效。
--------------------------------------------------------------------------------------------------------------------*/
Response.Cookies.Add(myCookie);
/*-------------------------------------------------------------------------------------------------------------------
设定Cookie之后,我们将刷新页面,为了使页面不读缓存,可以在本页URL
后面加一个GET参数,它是0-9999中任意一个整数
--------------------------------------------------------------------------------------------------------------------*/
Response.Redirect("Cookie.aspx?rand=" + r.Next(10000));
}
}
}
/*------------------------------------------------------------------------------------------------------------------
这个代码块是为“退出登录”这个文本按钮增加动作。注意:这个代码块是一个事件触发事件,你必须在.aspx页面的相应位置定义它。例如,返回到Cookie.aspx,把myLB组件的标签修改为:
<asp:LinkButton ID="myLB" runat="server" OnClick="myLB_Click">退出系统</asp:LinkButton>;还有一种更简单的“自动生成”办法:只要你回到Cookie.aspx的“设计”状态,双击myLB组件就可以看自动添加并转到本代码块,你只需要在代码块中填加以下代码:
--------------------------------------------------------------------------------------------------------------------*/
protected void myLB_Click(object sender, EventArgs e)
{
/*--------------------------------------------------------------------------------------------------------------
声明myCookie为名为auth的Cookie,且此Cookie的生存期为现在(立刻过期),清除Cookie之后,页面被重定向至本页,URL带有一个在0-9999的随机数
---------------------------------------------------------------------------------------------------------------*/
HttpCookie myCookie = new HttpCookie("auth");
//使cookie超时
Request.Cookies["someCookie"].Expires = DateTime.Now.AddDays(-1);
//使Cookie生效
Response.Cookies.Add(Request.Cookies["someCookie"]);
Response.Redirect("Cookie.aspx");
}
}