ASP.NET 狀態(tài)的傳遞和保存_.Net教程
1,HTTP協(xié)議是無狀態(tài)的。服務(wù)器不會記住上次給瀏覽器的處理結(jié)果,如果需要上次處理結(jié)果(上次狀態(tài))就需要瀏覽器把處理結(jié)果值(上次狀態(tài))再次給服務(wù)器。
2,URL傳值:通過URL參數(shù)或者通過Form表單進(jìn)行頁面件的傳值 (不能做到很自由的存取和讀取,而且不安全)
3,Cookie :①Cookie可以用來進(jìn)行更加自由的數(shù)據(jù)的存取和讀取。
�、贑ookie是和站點相關(guān)的,自己域名寫的只有自己的域名才可以讀取。
�、劭蛻舳讼蚍⻊�(wù)器發(fā)送請求的時候 處理發(fā)送Form表單信息以外還會把和站點有關(guān)的所有的Cookie發(fā)送給服務(wù)器,是強制的。
④服務(wù)器返回的數(shù)據(jù)處理HTML數(shù)據(jù)以外,還會返回修改的Cookie,瀏覽器拿到修改后的Cookie更新到本地的Cookie
�、莘⻊�(wù)器端使用Cookie案例,記住用戶名功能:
A,設(shè)置頁面值: Response.SetCookie(new HttpCookie("UserName",username))
B,讀取頁面值: username=Request.Cookies["UserName"].Value
�、逓g覽器關(guān)閉以后Cookie的聲明周期到期,也就是Cookie的默認(rèn)生命周期是瀏覽器的生命周期�?梢酝ㄟ^設(shè)置Expires屬性設(shè)置Cookie的過期時間:Cookie.Expires=DateTime.Now.AddDays(-1)
�、逤ookie在客戶端是以鍵值對存在的
4,Cookie缺點:①客戶端額可以手動清楚Cookie 所以Cookie里面存放的信息是可有可無的信息
�、跒g覽器對 Cookie 的大小有限制,因此只有不超過 4096 字節(jié)才能保證被接受
�、蹤C密信息不能放到Cookie里面
�、蹸ookie不能跨瀏覽器
5,Cookie的寫和讀: A,新建CookieTest.html頁面并添加 兩個按鈕分別用于Cookie的讀和寫
<!DOCTYPE html>
<html xm lns="http://www.w3.org/1999/xhtml">
<head>
<me ta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form>
<in put type="submit" name="Read" value="讀取Cookie" />
<in put type="submit" name="Write" value="寫入Cookie" />
<br />
讀取出來的Cookie: $Model.CookieValue
</form>
</body>
</html>
B,建立對應(yīng)的CookieTest.ashx頁面 實現(xiàn)Cookie的新建寫入本地以及讀取Cookie的值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace HttpNoStatus
{
/// <summary>
/// HttpCookie 的摘要說明
/// </summary>
public class CookieTest : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
//if else 判斷是點擊的那個按鈕
if (!string.IsNullOrEmpty(context.Request["Read"]))
{
if (context.Request.Cookies["Age"] != null)
{
HttpCookie cookie = context.Request.Cookies["Age"];
string strValue = cookie.Value;
var data = new { CookieValue = strValue };
//加載模板頁面并傳遞 Cookie Value的值
string strHtml = Common_Nvelocity.RenderHTML("CookieTest.html", data);
context.Response.Write(strHtml);
}
else
{
context.Response.Write("cookie 不存在");
}
}
else if (!string.IsNullOrEmpty(context.Request["Write"]))
{
//寫入新的Cookie
HttpCookie acookie = new HttpCookie("Age");
acookie.Value = "25";
acookie.Expires = DateTime.MaxValue;
context.Response.Cookies.Add(acookie);
//Cookie不存在 直接加載模板頁面
string strHtml = Common_Nvelocity.RenderHTML("CookieTest.html", null);
context.Response.Write(strHtml);
}
else
{
//第一次加載頁面
string strHtml = Common_Nvelocity.RenderHTML("CookieTest.html", null);
context.Response.Write(strHtml);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
6,Cookie最主要的一個功能是保存用戶的登陸名,這樣用戶在下次登陸的時候系統(tǒng)就可以自動填寫登陸名稱
A,新建LoginCookie.html頁面,頁面中添加我們經(jīng)常見到的 用戶名,用戶密碼,登陸
登陸頁面第一次加載的時候,設(shè)置默認(rèn)的登陸名為空,登陸成功以及再次登陸的時候系統(tǒng)就自動補充登陸用戶名
<!DOCTYPE html>
<html xm lns="http://www.w3.org/1999/xhtml">
<head>
<me ta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form action="LoginCookie.ashx" method="post">
<table>
<tr>
<td>登陸名</td>
<td>
<in put type="text" name="UserName" value="$Model.LoginUser" /></td>
</tr>
<tr>
<td>密碼</td>
<td>
<in put type="password" name="Password" /></td>
</tr>
<tr>
<td>
<in put type="submit" name="Login" value="登陸" /></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
B, 新建對應(yīng)的LoginCookie.ashx頁面,實現(xiàn)把用戶名讀取出來并寫入Cookie "ckLoginUser"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace HttpNoStatus
{
/// <summary>
/// LoginCookie 的摘要說明
/// </summary>
public class LoginCookie : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
//加載頁面直接顯示 頁面
if (context.Request.Form["Login"] == null)
{
string strHtml = "";
var data = new { LoginUser = "" }; //登陸賬號默認(rèn)為空
//判斷Cookie是否存在,如果存在 把Cookie的值傳遞到HTML頁面,如果不存在就是默認(rèn)的空
if (context.Request.Cookies["ckLoginUser"] != null)
{
data = new { LoginUser = context.Request.Cookies["ckLoginUser"].Value.ToString() };
}
strHtml = Common_Nvelocity.RenderHTML("LoginCookie.html", data);
context.Response.Write(strHtml);
}
else
{
//用戶登陸,保存用戶名到Cookie
HttpCookie LoginUser = new HttpCookie("ckLoginUser");
LoginUser.Value = context.Request.Form["UserName"];
LoginUser.Expires = DateTime.Now.AddDays(30);
context.Response.Cookies.Add(LoginUser);
//加載頁面直接顯示 頁面
string strHtml = Common_Nvelocity.RenderHTML("LoginCookie.html", new { LoginUser = context.Request.Form["UserName"] });
context.Response.Write(strHtml);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
7,以上方法把登陸賬號以Cookie的形式存放在客戶端,這樣每一次的請求就可以帶出用戶登陸名稱了
有一種情況: 用戶登陸成功以后就可以訪問網(wǎng)站的其他所有頁面,其他頁面就需要先判斷用戶是否登陸成功。
如果登陸成功為True放到Cookie中,這樣的客戶端就可以進(jìn)行篡改把False改為True從而可以非法訪問為授權(quán)頁面了,這樣放到Cookie就不安全了。
如果登陸成功放到服務(wù)器端,那么網(wǎng)站的多個頁面就可以直接讀取到這個值,而且是安全的不會被客戶端篡改的了。
- asp圖片防盜鏈的代碼
- asp (author:killer)禁止站外提交表單的代碼
- 探索c#之遞歸APS和CPS
- ASP.NET MVC中將控制器分離到類庫的實現(xiàn)
- ASP.NET實現(xiàn)推送文件到瀏覽器的方法
- ASP.NET列出數(shù)據(jù)庫活躍鏈接的方法
- ASP.NET中使用Application對象實現(xiàn)簡單在線人數(shù)統(tǒng)計功能
- .NET程序調(diào)試技巧(一):快速定位異常的一些方法
- 淺談ASP.NET中多層架構(gòu)
- ASP.NET緩存處理類實例
- ASP.NET創(chuàng)建動態(tài)縮略圖的方法
- ASP.NET中MVC 4 的JS/CSS打包壓縮功能
- 相關(guān)鏈接:
- 教程說明:
.Net教程-ASP.NET 狀態(tài)的傳遞和保存
。