asp.net session的使用與過(guò)期實(shí)例代碼
1.Session是一種Web會(huì)話中的常用狀態(tài)之一。
2.Session提供了一種把信息保存在服務(wù)器內(nèi)存中的方式。他能儲(chǔ)存任何數(shù)據(jù)類型,包含自定義對(duì)象。
3.每個(gè)客戶端的Seesion是獨(dú)立存儲(chǔ)的。
4.在整個(gè)會(huì)話過(guò)程中,只要SessionID的cookie不丟失,都會(huì)保存Session信息的。
5.Session不能跨進(jìn)程訪問(wèn),只能由該會(huì)話的用戶訪問(wèn)。應(yīng)為提取Session數(shù)據(jù)的id標(biāo)識(shí)是以Cookie的方式保存到訪問(wèn)者瀏覽器的緩存里的。
6.當(dāng)會(huì)話終止,或過(guò)期時(shí),服務(wù)器就清除Session對(duì)象。
7.Session常用于保存登錄用戶的ID.
8.Session保存的數(shù)據(jù)是跨頁(yè)面全局型的。
例如我們想了解一下訪問(wèn)我們網(wǎng)站的用戶瀏覽了幾個(gè)頁(yè)面,我們可能在用戶可能訪問(wèn)到每個(gè)的頁(yè)面中加入:
<%
If Session("PageViewed") = ""Then
Session("PageViewed") = 1
Else
Session("PageViewed") = Session("PageViewed") + 1
End If
%>
通過(guò)以下這句話可以讓用戶得知自己瀏覽了幾個(gè)頁(yè)面:
<%
Response.Write("You have viewed " & Session("PageViewed") & " pages")
%>
Session的使用
<head runat="server">
<title></title>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
function getSessionClick(action) { //這個(gè)函數(shù)是為了知道哪一個(gè)提交按鈕被點(diǎn)擊
$("#hidlgc").val(""); //清空隱藏值
$("#hidlgc").val(action); //給隱藏控件賦值
}
</script>
</head>
<body>
<form id="form1" method="post" action="MySession.aspx">
<table>
<tr>
<td>賬號(hào):</td><td><input type="text" name="txtUid" /></td>`
</tr>
<tr>
<td>密碼:</td><td><input type="password" name="txtPwd" /></td>
</tr>
<tr>
<td colspan="2">
<input type="hidden" value="" id="hidlgc" name="hidlgclick" />
<input onclick="getSessionClick('lgclick')" type="submit" value="登錄" />
<input type="submit" onclick="getSessionClick('getSession')" value="獲取session" />
<input type="submit" onclick="getSessionClick('backLg')" value="退出登錄" />
</td>
</tr>
</table>
</form>
</body>
.net代碼
protected void Page_Load(object sender, EventArgs e)
{
//把用戶id寫(xiě)入session中
if (Request.Form["hidlgclick"] == "lgclick")
{
if(Request.Form["txtUid"].ToString()=="admin"&&Request.Form["txtUid"].ToString()=="admin") //判斷用戶登錄
{
Session["userName"] = Request.Form["txtUid"].ToString(); //把用戶id保存到session中
Response.Write(Session["userName"].ToString()+"---點(diǎn)擊登錄"); //獲取session,并寫(xiě)入頁(yè)面
}
}
//獲取Session
if (Request.Form["hidlgclick"] == "getSession")
{
if (Session["userName"] != null)
{
Response.Write(Session["userName"].ToString() + "---點(diǎn)擊獲取session"); //獲取session,并寫(xiě)入頁(yè)面
}
}
//取消當(dāng)前會(huì)話,相當(dāng)于注銷(退出登錄)。
if (Request.Form["hidlgclick"] == "backLg")
{
Session.Abandon();
}
}
那么我們要怎么判斷session是否過(guò)期了呢
方法一:最笨的方法,在每個(gè)頁(yè)面的page_load()方法中判斷。
If(Session[“UserId”]!=null)
{
//登陸成功的情況
}
Else
{
//response.write(“<script>alter(‘請(qǐng)登陸');</script>”);
}
這種方法在每個(gè)頁(yè)面都需要寫(xiě)入重復(fù)的代碼。代碼冗余
方法二:可以在HttpModule中判斷,在HttpModule中注冊(cè)請(qǐng)求管道的AcquireRequestState
事件(可以拿到session的那個(gè)事件)
步奏:
1:新建一個(gè)繼承IHttpModule接口的類Module
2:讓Module類實(shí)現(xiàn)接口成員。
3:在Init()方法中對(duì)Context進(jìn)行注冊(cè)AcquireRequestState事件(在這個(gè)事件中可以拿到Session)
4:在方法中寫(xiě)
void context_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
if (app.Context.Session["userId"] == null)
{
app.Response.Write("<script>alert('沒(méi)有登錄');</script>");
}
}
5:在web.config配置文件中<system.web>節(jié)點(diǎn)下添加一個(gè)節(jié)點(diǎn)
<httpModules>
<add name="demo" type="Module"/> <!--type后面是命名空間.類名-->
</httpModules>
使用這種方法會(huì)在每個(gè)頁(yè)面加載的時(shí)候都先檢查module。
原理是實(shí)現(xiàn)IHttpModule接口的類是在執(zhí)行頁(yè)面之前執(zhí)行的。 在page_load()事件執(zhí)行之前就判 斷Session如果不存在就提示。
這種方法效率能高一些,因?yàn)槿绻淮嬖?session直接就可以處理。后面的一系列事件都可以不 用執(zhí)行。
方法三:在page類上做點(diǎn)手腳
Page類中有OnInit()這個(gè)虛方法。
步奏:
1:創(chuàng)建一個(gè)集成Page類的類TestSession
2:在TestSession中重寫(xiě)OnInit()這個(gè)方法。
3:在OnInit()方法中判斷Session
4:在需要判斷session的頁(yè)面集成TestSession這個(gè)類,而不是繼承Page類
這種方法比較靈活,在需要判斷session的頁(yè)面中繼承TestSession就可以,不需要判斷session 的頁(yè)面直接繼承Page就行了
Session的功能的缺陷
目前ASP的開(kāi)發(fā)人員都正在使用Session這一強(qiáng)大的功能,但是在他們使用的過(guò)程中卻發(fā)現(xiàn)了ASP Session有以下缺陷:
進(jìn)程依賴性:ASP Session狀態(tài)存于IIS的進(jìn)程中,也就是inetinfo.exe這個(gè)程序。所以當(dāng)inetinfo.exe進(jìn)程崩潰時(shí),這些信息也就丟失。另外,重起或者關(guān)閉IIS服務(wù)都會(huì)造成信息的丟失。
Session狀態(tài)使用范圍的局限性:剛一個(gè)用戶從一個(gè)網(wǎng)站訪問(wèn)到另外一個(gè)網(wǎng)站時(shí),這些Session信息并不會(huì)隨之遷移過(guò)去。例如:新浪網(wǎng)站的WWW服務(wù)器可能不止一個(gè),一個(gè)用戶登錄之后要去各個(gè)頻道瀏覽,但是每個(gè)頻道都在不同的服務(wù)器上,如果想在這些WWW服務(wù)器共享Session信息怎么辦呢?
Cookie的依賴性:實(shí)際上客戶端的Session信息是存儲(chǔ)與Cookie中的,如果客戶端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
鑒于ASP Session的以上缺陷,微軟的設(shè)計(jì)者們?cè)谠O(shè)計(jì)開(kāi)發(fā) ASP.NET Session時(shí)進(jìn)行了相應(yīng)的改進(jìn),完全克服了以上缺陷,使得ASP.NET Session成為了一個(gè)更加強(qiáng)大的功能。
- 如何在ASP.NET Core中使用Session的示例代碼
- 如何解決asp.net負(fù)載均衡時(shí)Session共享的問(wèn)題
- Asp.Net Core中基于Session的身份驗(yàn)證的實(shí)現(xiàn)
- 淺談ASP.NET Core中間件實(shí)現(xiàn)分布式 Session
- 解析Asp.net Core中使用Session的方法
- asp.net(C#)清除全部Session與單個(gè)Session的方法
- 詳解ASP.NET中Session的用法
- ASP.NET ASHX中獲得Session的方法
- ASP.NET將Session保存到數(shù)據(jù)庫(kù)中的方法
- Asp.net中判斷一個(gè)session是否合法的方法
- ASP.NET MVC在基控制器中處理Session
相關(guān)文章
ASP.NET 頁(yè)面?zhèn)髦党S梅椒偨Y(jié)
ASP.NET 頁(yè)面?zhèn)髦档姆绞接泻芏?,本文整理了一些比較常用方法,大家可以根據(jù)自己需求自由選擇2013-08-08WPF實(shí)現(xiàn)文本描邊+外發(fā)光效果的示例代碼
這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)文本描邊以及外發(fā)光的效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定幫助,需要的可以參考一下2022-03-03asp.net在事件中啟動(dòng)線程來(lái)打開(kāi)一個(gè)頁(yè)面的實(shí)現(xiàn)方法
點(diǎn)擊一個(gè)按鈕做兩件事情,一件需要點(diǎn)擊按鈕馬上完成,另一件事情是點(diǎn)擊按鈕后做其他事情,不會(huì)的朋友一起來(lái)看看下面是如何實(shí)現(xiàn)的2014-11-11.NET Core 2.0 Preview2 發(fā)布匯總
這篇文章主要為大家詳細(xì)介紹了.NET Core 2.0 Preview2 發(fā)布匯總的相關(guān)內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06asp.net中顯示1至20相同數(shù)字相乘的結(jié)果,若值比50小就不顯示
感興趣的網(wǎng)友也可以練習(xí)練習(xí)?,F(xiàn)在Insus.NET的作答如下,但老師還沒(méi)有看,因此答案是否正確或是最好的,還不能確定,只是供參考2012-05-05ASP.NET Core Controller與IOC結(jié)合問(wèn)題整理
在本篇文章里小編給大家整理了一篇關(guān)于ASP.NET Core Controller與IOC結(jié)合問(wèn)題整理內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2021-01-01