您的位置:首页 > 编程语言 > ASP

ASP.NET的Cookie和Session

2012-03-29 23:29 211 查看
http://www.cnblogs.com/shineqiujuan/archive/2008/05/03/1180612.html

通过上一部分的学习,我们已知道:Cookie是ASP中的一个对象集合,它以加密的形式被保存在客户端特定文件夹内,用户可以修改、删除甚至伪造Cookie;而Session是一个服务器对象,它被保存在服务器,所以相对地,使用Session较为安全,但较耗费服务器资源。你可以随意设置Cookie的生存期,例如1年。但如果你让一个Session变量始终生存在服务器主机内,对你的服务器来说并不是一个好的选择,通常来讲,涉及到“管理权限”的时候才会用Cookie+Session双认证。
首先我们还是在ASP.NET中练习写入和读取Cookie和Session,了解一些Cookie的基本知识:Cookie对象是.NET Framework中HttpCookie类实例化的模型。下面我们来学习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", "admin");
给名为myCookie的Cookie对象(必须实现建好)增加一个auth键名,其值为admin。
4. 附加键值,使Cookie生效:标准代码格式为
Response.Cookies.Add(myCookie);
上句代码把名为myCookie的对象附加到Cookie数组内。注意,在设定Cookie完毕之后一定要加上这句代码才能生效,
4. 设定生存期:设置生存期的标准代码形式如下
myCookie.Expires = DateTime.Now.AddDays(3);
设定名为myCookie的Cookie对象生存期为当前时间加上3天。需要注意的是,设定Cookie之后如果页面不刷新,是不会显示任何效果的。
5. 获取Cookie的值:获取Cookie值的标准代码格式为
myCookie.Values["auth"];
上句代码可以获取名为myCookie的Cookie对象键名为auth的键值。如果不存在,则返回null。

10.3.2 ASP.NET中练习使用Cookie

在Visual Studio 2005“解决方案资源管理器”内的地球图标点右键→“添加新项”,在弹出的窗口中把文件名命名为Cookie.aspx,按“确定”按钮,片刻之后,“解决方案资源管理器”里便出现了新添加的页面文件Cookie.aspx和逻辑文件Cookie.cs。我们首先在HTML状态下弄懂ASP.NET Cookie的使用方法,只要原理弄懂,在Flash RIA工程中只要使输出文档类型由HTML变为XML就万事大吉了。
为了增加读者的实际动手能力,我们在示例中选用了一个广为人知“BBS登录系统”,相信所有泡过BBS论坛的朋友对此都不陌生
图10.37所示为国内Flash门户网站“闪吧 http://www.flash8.net/”的登录系统,这个登录系统主要包含几个部分:“用户名、密码”输入框、“有效期”下拉菜单,“登录”按钮。上述一切都被包含到一个表单标签中,一旦“登录”按钮被按下,输入框和下拉菜单中的值就会以POST的方式提交给后台页面加以验证。



图10.37
我们为了模拟这种效果,需要在Visual Studio 2005的“工具箱”中向工作区拖入一个Panel组件(ID命名为myPanel)、两个TextBox组件(ID分别命名为myUID和myPWD)、一个Button组件(ID命名为myBTN)、一个DropDownList组件(ID命名为myDDL)和一个LinkButton组件(ID命名为myLB)。并且我们需要把 除LinkButton以外的其他组件都拖入Panel内。Panel是“群组”组件,其他组件一旦被拖入Panel组件,我们就可以通过控制Panel组件统一管理被它包含的组件。例如,在本例中只需写一句
myPanel.Visible = false;就可以让所有包含在myPanel组件中的所有组件不可见。在myUID和myPWD组件的前面分别添加提示文字:“用户名”和“密 码”;在myLB的“属性窗口”中添加它的Text属性为“退出系统”;单击myDDL组件,在右侧“属性窗口”里找到“杂项”→Items表格,单击(collection)右侧的“...”按钮,为myDDL下拉菜单绑定数据源(这和Flash里的ComboBox很像),如图10.38所示:



图10.38
在弹出的窗口,按图10.39所示填写:



图10.39
其中我们可以通过“添加”一个选项、每个选项都右4个属性Enabled(是否可以选择)、Selected(是否默认就处于“被选中”状态。注意:最多只能有一项可以设置为“true”)、Text(下拉列表的文字)、Value(下拉列表的值)。四个成员的属性设置如下表所:示

ID属性

成员

Enabled
Selected
Text
Value
0
True
True
不保存
no
1
True
False
一天
oneday
2
True
False
一周
oneweek
3
True
False
一个月
onemonth
各组件摆放位置如图10.40所示:



图10.40
页面文件编辑完毕,下面我们该考虑如何编写逻辑文件,思路如下:
每当页面被加载时,逻辑文件首先判定本页是被POST方法请求而访问的,还是被直接访问的。如果是前者,则要接收POST方法传过来的用户名和密码值,并与正确值对比;一旦用户名和密码值错误,则清空所有Cookie,返回本页;如果用户名密码正确,则赋予浏览者相应的Cookie及有效期。按下“退出系统”按钮,后台逻辑脚本负责清空上一Cookie。在“解决方案资源管理器”中双击逻辑文件Cookie.cs,如图10.41:



图10.41

10.3.3 Cookie.aspx的逻辑代码

在Cookie.cs中输入以下代码:
/*--------------------------------------------------------------------------------------------------------------------------------
以下诸句为Visual Studio 2005 创建每个逻辑文件而自动生成的代码,即引用了可能在编程中使用的一些类,这和Flash类文件中的“import ……”很相似:引用类的实例之前必须要事先引用类。
---------------------------------------------------------------------------------------------------------------------------------*/
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/*--------------------------------------------------------------------------------------------------------------------------------
下句也是软件自动生成的代码,默认情况下,你的.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 2005 软件自动生成的代码,前边我们提到过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"] == "admin")
//返回登录信息,群组面板不可见,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 == "lau" && pwd == "abcdefg")
{
//声明一个字符串变量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", "admin");
/*---------------------------------------------------------------------------------------------------------------------
如果“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("someCookie");
myCookie.Expires = DateTime.Now;
Response.Cookies.Add(myCookie);
Response.Redirect("Cookie.aspx?del=true&rand=" + r.Next(10000));
}
}

10.3.4 编写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>Cookie测试</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Panel ID="myPanel" runat="server" Height="89px"
Width="260px">
用户名:<asp:TextBox ID="myUID" runat="server">
</asp:TextBox> <br />
密   码:<asp:TextBox ID="myPWD" runat="server" TextMode=
"Password"></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="submit" />
</asp:Panel>
<asp:LinkButton ID="myLB" runat="server" OnClick=
"myLB_Click">退出系统</asp:LinkButton></div>
</form>
</body>
</html>
执行效果如图10.42所示:



图10.42
当输入正确的用户名和密码之后转向的随机页面如图10.43所示:



图10.43
* 注:这个示例的源文件在附带光盘下 第十章\3\cookie.aspx和cookie.aspx.cs
注意:只要你没有清空Cookies,此Cookie在其整个生存期都有效,你不妨重新打开浏览器试试效果。Cookie给我们带来很大方便,例如:在制作Flash留言本时,如果某些留言是只有高级会员才能观看的,我们就可以用ASP.NET检测客户端Cookie,如果存在并且满足观看权限,则生成其完整信息的XML信息,反之则生成受限制的XML信息。

10.3.5 ASP.NET中的Session

说完了Cookie,我们再来说说Session。它和Cookie类似,都可以用变量值表示浏览者的身份,不同的是:Cookie存于客户端,而Session变量存于服务器。未经授权,你可以修改甚至伪造一个Cookie,但你不能修改Session,在安全性方面,Session明显更胜一筹,但如果浏览者较多,Session保存时间较长,势必会给服务器造成较大的负担。所以,现在流行的办法是涉及到“管理”时采用“Cookie+Session双验证”,而普通会员只采取“Cookie单验证”,这样会使安全性和服务器负载达到较好的平衡。
在使用Session对象之前,我们有必要对ASP.NET中的Session有一个概念性的了解:
由于Session被保存在服务器上,不需要对客户端执行什么操作。所以Session的使用方法较Cookie要容易的多,常用的Session操作如下表所示:

对象名:
Session

赋予Session:

Session["键名"]=键值;

取得Session:

Session["键名"]

销毁Session:

Session.Abandon();

10.3.6 在ASP.NET中练习使用Session

我们还是在示例中学习ASP.NET中Session的用法。在Visual Studio 2005“解决方案资源管理器”下的地球图标上点右键→“添加一个新项目”,命名为Session.aspx,稍等片刻即可在“解决方案资源管理器”看到页面文件和逻辑文件。
在Session.aspx的设计界面,从工具箱里拖入工作区一个Panel组件、两个TextBox组件、一个Button组件和一个LinkButton组件。命名方式和上一例子相同:分别为myPanel、myUID、myPWD、myBTN和myLB。由于Session默认生存期为20分钟,所以我们并不需要上例的DropDownList下拉菜单。摆放顺序与上例类似,如图10.44所示:



图10.44
双击myLB文本按钮,Visual Studio 2005软件将自动转到其逻辑文件中,并且为此按钮增加了一个逻辑代码块。代码如图10.45所示:



图10.45
双击时,页面代码Session.aspx关于myLB标签也自动增加了一个触发代码:
<asp:LinkButton ID="myLB" runat="server" OnClick="myLB_Click">退出管理</asp:LinkButton>

10.3.7 逻辑代码的编写

在“解决方案资源管理器”中点选Session.aspx下面处于折叠状态的Session.aspx.cs,在其中输入如下代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Session : System.Web.UI.Page
{
//下面代码声明了用于接收用户名,密码,随机数的变量
private string uid;
private string pwd;
Random r = new Random();
protected void Page_Load(object sender, EventArgs e)
{
//页面初始化时,“退出登录”这个连接是不可见的
myLB.Visible=false;
//如果本页不是被POST提交而访问的
if(!IsPostBack){
//如果Sesson对象集中auth子集的值为admin
if(Session["auth"]=="admin"){
//返回登录信息
Response.Write("你已登录管理状态");
//登陆群组不可见
myPanel.Visible=false;
//一旦登录,“退出登录”这个按钮就可见
myLB.Visible=true;
//如果密码错误,则重新进行登录循环
}else{
myPanel.Visible=true;
}
}else{
//用uid和pwd这两个变量接收文本输入框的值
uid = Request.Form["myUID"];
pwd = Request.Form["myPWD"];
//如果满足用户名和密码值
if (uid == "lau" && pwd == "abcdefg")
{
//赋予Session
Session["auth"] = "admin";
//返回随机页面
Response.Redirect("Session.aspx?rand=" + r.Next(10000));
}
}
}
//这是刚才双击myLB组件生成的代码块
protected void myLB_Click(object sender, EventArgs e)
{
//销毁Session
Session["auth"] = null;
Session.Abandon();
//跳转到随机页面
Response.Redirect("Session.aspx?rand="+r.Next(100));
}
}

10.3.8 编写Session页面文件

逻辑代码文件编写完成之后,我们来编写页面文件Session.aspx,在“解决方案资源管理器”中双击Session.aspx,在其中输入代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Session.aspx.cs" Inherits="_Session" %>
<!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>Session测试</title>
</head>
<body>
<form id="form1" runat="server">
<div> 
<asp:Panel ID="myPanel" runat="server" Height="89px"
Width="260px">
用户名:<asp:TextBox ID="myUID" runat="server">
</asp:TextBox> <br />
密   码:<asp:TextBox ID="myPWD" runat="server"
TextMode="Password"></asp:TextBox> <br />
<br/>
<asp:Button ID="myBTN" runat="server" Text="submit"/>
</asp:Panel>
<asp:LinkButton ID="myLB" runat="server" OnClick="myLB_Click">退出管理</asp:LinkButton></div>
</form>
</body>
</html>
调试效果如图10.46所示:



图10.46
输入正确的密码之后,效果如图10.47所示:



图10.47
* 注:这个示例的源文件在附带光盘 第十章\4\session.aspx和session.aspx.cs
关闭浏览器或20分钟后不执行操作,Session将过期。
通过本节学习,我们对ASP.NET中的Cookie和Session使用有了一个概括性了解。建议读者自己多多尝试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: