一、ViewState
1.为什么要使用ViewState
(1)导致一些敏感信息被泄漏;
(2)针对ViewState的攻击
(3)很差的性能,在某些极端的情况下可能根本就没有性能。
(4)并发性差 -- 想象一下如果每次回传的数据都有50kB,那么你的服务器能承受多少并发的访问量呢?
(5)糟糕的全局设计
2.ViewState为什么重要,它能做什么?
(1)以键值对的方式来存控件的值,和Hashtable的结构类似;
(2)跟踪那些ViewState中出现改变的值,以便对这些脏数据(dirty)进行进一步的处理;
(3)通过序列化将ViewState中的值保存在页面的隐藏域(Hidden Field)中(这是默认的持久化方式),并通过反序列化得到对应的ViewState对象以便进行相应的操作;
(4)在页面回传的过程中自动的存储ViewState中的跟踪的值。
3.
(1)在页面回传的过程中保存状态值,使原本没有“记忆”的Http协议变得有“记忆”起来。
(2)大多数ASP.NET 服务器控件存储其属性值得方式是通过ViewState的方式存储的,而不是我们通常想象的那样通过类的私有字段来存储。
4.使用ViewState的前提条件是什么?
(1) 页面上存放一个 runat="server" 的表单,那么生成html代码的时候就会自动添加一个名字叫 __VIEWSTATE的隐藏域到html代码中。
(2)当页面的这个runat="server"的表单被提交的时候,这个隐藏域 也会被提交到服务器。
(3)通俗的说,页面对象的ViewState属性,只有在当前页面表单提交操作的时候才有用。VIEWSTATE适用于同一个页面在不关闭的情况下多次与服务器进行POST表单交互
5.最后解释:ViewState就是服务器将数据存放在输出给浏览器的HTML代码里,并且通过浏览器提交表单时重新获取这些数据的一种机制。
小练习:
前台:
<!--这里不能忘了runat="server"-->
<form id="form1" runat="server">
<div>
<input type="submit" value="递增" />
</div>
</form>
后台:
if (ViewState["num"] != null)
{
//如果ViewState["num"]不为空,则为num赋予viewState的值并使其自增
int num = Convert.ToInt32(ViewState["num"]);
num++;
Response.Write(num);
ViewState["num"] = num;
}
else
{
//如果ViewState["num"]无值,则打印1,并为ViewState复制
Response.Write(1);
ViewState["num"] = 1;
}
二、Cookie :在浏览器端长久保存数据的一种机制。(浏览器缓存Cookie,浏览器硬盘Cookie)
本质上,就是在浏览器端的一个txt文件。
1.使用场景:最近浏览商品;2周内免登陆;
2.如何删除Cookie,创建一个相同键的Cookie对象,设置失效时间为负数(其实就是创建一个已经失效的Cookie),发给浏览器,浏览器会用这个失效的Cookie把原来的Cookie给覆盖掉,那么就达到了删除Cookie的目的。
3.注意:设置了cookie的发送目录,也就是说:只有当用户访问 web/admin路径的时候,浏览器才回将这个cookie发送给服务器
cookie.Path = "/Web/admin/";
4.Cookie是不论浏览器请求服务器什么类型的资源,都会被发到服务器去的。(哪怕是请求图片,css文件,js文件都会发送cookie)
5.起初对Cookie的定义是网站放置在硬盘上的程序。它们驻留在计算机上,用于收集有关您和您在互联网上执行的任何操作的信息,只要网站需要,就可以下载此Cookie收集的所有信息。
6.Cookie是指Web服务器可以在用户的硬盘上存储的一段文本。Cookie允许网站将信息存储在用户的计算机上,并在以后检索此信息。这些信息以名称/值对的形式存储。网站可以为每个访问者生成唯一的ID号(也就是所谓的SessionId),并使用Cookie文件将此ID号存储在每个用户的计算机上。
7.如果不设置失效时间,则浏览器会将此cookie保存到浏览器缓存中;如果设置,就存硬盘里。
Cookie机制
主要是指服务器和浏览器间 互相传递 Cookie数据的一种 流程。
1.服务器到浏览器:
1.1服务器通过响应报文的 Set-Cookie 方式向浏览器发送 Cookie 键值对和失效时间和path等数据
1.2浏览器接收到服务器的Set-Cookie命令之后,会自动的根据内容 在浏览器端创建Cookie文件。
1.3浏览器会根据Cookie的失效时间,自动清除过期的Cookie文件。
2.浏览器到服务器
2.1当浏览器请求一个域名的时候,会自动在浏览器端读取 该域名下的Cookie文件,并将里面的键值对装入请求报文,发送给服务器。
2.2当服务器接收到浏览器的请求报文里的Cookie命令后,会自动将里面的键值对 封装到 Request.Cookies集合中,供程序员使用。
小练习:利用cooikes实现登录校验
<head>
<title></title>
<script type="text/javascript">
window.onload = function ()
{
document.getElementById("btnLogin").onclick = function ()
{
document.getElementById("form1").submit();
}
}
</script>
</head>
<body>
<form id="form1" action="" method="post">
<div>
<input type="hidden" name="ispostback" value="1" />
<input type="text" id="txtName" name="txtName"/><br /><br />
<input type="text" id="txtPwd" name="txtPwd" /><br /><br />
<input type="button" id="btnLogin" value="登录"/><br />
</div>
</form>
</body>
后台:
string name = Request.Form["txtName"];
string pwd = Request.Form["txtPwd"];
if (!string.IsNullOrEmpty(Request.Form["ispostback"]))
{
if (name == "sxycxwb" && pwd == "123")
{
//1.服务端创建Cookie对象,并设置键值对
HttpCookie cookie = new HttpCookie("loginName", name);
//2.设置Cookie失效时间
cookie.Expires = DateTime.Now.AddMinutes(1);
//3.将Cookie对象 添加到 相应对象的Cookie集合中
Response.Cookies.Add(cookie);
HttpCookie cookieTime = new HttpCookie("exTime",cookie.Expires.ToString());
cookieTime.Expires = cookie.Expires;
Response.Cookies.Add(cookieTime);
PageHelper.showMsg("欢迎" + name + "登录成功!","Cookies.aspx");
}
else
{
PageHelper.showMsg("用户名或密码错误,登录失败!", "Cookies.aspx");
}
}
}
三、Session
1.配置整个网站的Session失效时间
<system.web>
<sessionState timeout="20"></sessionState>
</system.web>
2.当浏览器禁用了 Cookie后,那么服务器就可以选择将 SessionId存入地址栏的url中来传递。
3.注意:一般处理程序中,如果要使用 Session的话,必须实现 IRequiresSessionState 接口
这种情况下的接口叫 【标识接口】,它不是为了规范子类的行为,也就无所谓在接口里定义方法。
它的存在,就是为类加上一个【标识】而已,当程序创建类的对象的时候可以检查是否有此【标识】。
4.Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串
小练习:利用Session验证登录信息,并作友情提示
string name = Request.Form["txtName"];
string pwd = Request.Form["txtPwd"];
if (!string.IsNullOrEmpty(Request.Form["ispostback"]))
{
if (name == "sxycxwb" && pwd == "123")
{
PageHelper.showMsg("欢迎" + name + "登录成功!", "SessionCheck.aspx");
Session["info"] = name + ":" + pwd;
}
else
{
PageHelper.showMsg("用户名或密码错误,登录失败!", "Cookies.aspx");
}
}
if (Session["info"] != null)
{
Response.Write("欢迎" + Session["info"].ToString());
}
else
{
PageHelper.showMsg("对不起,请重新登录","SessionTest.aspx");
}