如果你對以下問題感興趣但是又不能確切的回答,你就應該閱讀此文.
1.Session是什么?
2.Cookie又是什么?
3.如果完全禁用了Cookies,Session還起作用嗎?
4.為什么有的網站登錄一次以后就不用再登錄?
5.ASP中的Session是否依賴Cookie?
6.JSP中的Session是否依賴Cookie?
7.ASP.NET中的Session又是怎么回事?
下面將詳細的講述會話狀態的維持,看完之后你應該可以回答上面的幾個問題了
1.Session和Cookie的由來
這里我不區分Cookie和Cookies,只是一個復數形式而已.我們都知道http是無狀態的協議,就是說每次請求都是分開的,服務器根本不 知道兩次請求是否是同一個人,如果我們的內容是完全公開的,也就是所有內容誰都可以看(比如sina的新聞),這種情況呀根本就沒有必要知道兩次請求是不 是同一個.但是大部分情況下我們不希望這樣,我們希望只有會員登錄之后才能訪問(所有的論壇幾乎都是這樣).而其他人不允許他們反問,于是便要知道每次請 求的是不是同一個人,這就是會話,也就是一個Session,而且這個Session是以Cookie為基礎的,Cookie最才是網景公司提出的,也叫 小甜餅.
服務器端對每個請求維持一個會話,并且有一個唯一的SessionID.如果客戶端沒有禁用Cookie的話,客戶第一次請求的時候這個ID會 寫到客戶端的硬盤上(不相信?看一下文件夾C:\Documents and Settings\UserName\Local Settings\Temporary Internet Files 下的Cookie文件,都是文本文件).以后你每次請求的時候都會加上這個ID值,服務器端就可以知道是不是同一個請求了.如果還不相信的話,你可以這樣 做個試驗:
1.選擇一個你要用用戶名登錄的網站(最好是ASP的,如論壇).
2.先正常登錄一遍,確定可以登錄,再把瀏覽器關了)
3.選擇Internet選項(IE屬性頁),選擇隱藏選項卡,把設置調到最高,確定.
4.重新開IE,登錄你剛才登錄過的站點,怎么登都等不上去的.
2.Session和Cookie的關系
當前維持會話狀態的途徑有且只有兩種種
第一種:Cookie,最常見的,95%以上的會話都是Cookie的功勞.
第二種:URL重寫,把SessionID附加到URL中,JSP實現了但用的不多.
如果你用過session,你可能很奇怪:我們一般都是用session維持會話,這里怎么沒有?
答案很簡單:上面兩種都是途徑,Session是我們的目的.一句話概括Session和Cookie的關系:Cookie是維持Session最常見的一種途徑.
3.Cookie的過期和Session的超時
你可以自己設置Cookie的過期(其實是服務器替你設置的),如果你設置為用不過期,
以后就都不用再重新登陸了,如果這臺機器就你一個人用完全可以這樣設置,否則
最好不要這樣設置.如果你很長時間沒有反應,就是沒有新的請求,Session就有可能
過期,你可能遇到這樣的情況:明明已經登錄了,過了一會兒回來卻說我沒有登錄
提示重新登錄.就是因為Session過期了,服務器可以設置過期的時間.
4.禁用了Cookie如何實現會話
如果客戶端完全禁用Cookie,將會發生什么現象:
對于ASP,無法跟蹤會話,也就是每個請求都當作新的請求.
對于JSP,可以通過重寫URL實現會話,session.encodeURL(String path)
session.encodeURL("index.jsp")=index.jsp;jsessionid=431D980051204FC8DC3
BF75840F7AF71
可以看到后面的sessionid并沒有包括在QueryString中(在?后面)
對于ASP.NET 同樣支持重寫URL,學習JSP的,不過JSP并不是所有的WebServer都支持重寫URL
5.QueryString和HiddenForm
你可能覺得他們也可以維持會話,但是事實上是不可以的,他們只能傳遞參數。不過在ASP.NET中的服務器事件模型廣泛了使用了Hidden來表示控件的viewState(這個也是ASP.NET比ASP,JSP先進的地方,是一種全新的技術)
為什么他們只能傳遞參數而不能實現會話呢?大致過程是這樣的:
服務器接收到一個請求,如果沒有獲得SessionID,就產生一個新的會話.可能你認為這樣可以保持會話 url?sessionid=234234234234.
這是一個誤區,因為服務器已經處在一個新的會話中了,只不過可以獲得上次會話的ID號而已.
6.QueryString和HiddenForm的區別
QueryString是URL中問號后面的?querystring.一般瀏覽器都把URL限制在255個字符以內所以沒辦法傳遞大量的數據,方法必須為get.HiddenForm是表單數據,方法為可以是get或者post(一般用post)
7.誤區
我看到有人在論壇上說在自己的Web服務器上構建一個Session,然后鏈接到別人的程序這樣可以越過驗證.Session只在同一個 Application中才有效,所以這個設想是徒勞的,不過如果你們的程序是同一個Application中的(比如一些個人主頁空間就有可能)是可以 這樣做的.
8.題外話
利用Cookie攻擊,因為客戶端完全禁用Cookie之后,每次請求服務器都要產生一個會話.如果會話超時時間是15分鐘的話,我們通過完全禁用Cookie的方法在15分鐘內不停的請求讓服務器產生大量的會話,實行DOS攻擊(前提是大量的請求和服務器不做過濾)
1.Session是什么?
2.Cookie又是什么?
3.如果完全禁用了Cookies,Session還起作用嗎?
4.為什么有的網站登錄一次以后就不用再登錄?
5.ASP中的Session是否依賴Cookie?
6.JSP中的Session是否依賴Cookie?
7.ASP.NET中的Session又是怎么回事?
下面將詳細的講述會話狀態的維持,看完之后你應該可以回答上面的幾個問題了
1.Session和Cookie的由來
這里我不區分Cookie和Cookies,只是一個復數形式而已.我們都知道http是無狀態的協議,就是說每次請求都是分開的,服務器根本不 知道兩次請求是否是同一個人,如果我們的內容是完全公開的,也就是所有內容誰都可以看(比如sina的新聞),這種情況呀根本就沒有必要知道兩次請求是不 是同一個.但是大部分情況下我們不希望這樣,我們希望只有會員登錄之后才能訪問(所有的論壇幾乎都是這樣).而其他人不允許他們反問,于是便要知道每次請 求的是不是同一個人,這就是會話,也就是一個Session,而且這個Session是以Cookie為基礎的,Cookie最才是網景公司提出的,也叫 小甜餅.
服務器端對每個請求維持一個會話,并且有一個唯一的SessionID.如果客戶端沒有禁用Cookie的話,客戶第一次請求的時候這個ID會 寫到客戶端的硬盤上(不相信?看一下文件夾C:\Documents and Settings\UserName\Local Settings\Temporary Internet Files 下的Cookie文件,都是文本文件).以后你每次請求的時候都會加上這個ID值,服務器端就可以知道是不是同一個請求了.如果還不相信的話,你可以這樣 做個試驗:
1.選擇一個你要用用戶名登錄的網站(最好是ASP的,如論壇).
2.先正常登錄一遍,確定可以登錄,再把瀏覽器關了)
3.選擇Internet選項(IE屬性頁),選擇隱藏選項卡,把設置調到最高,確定.
4.重新開IE,登錄你剛才登錄過的站點,怎么登都等不上去的.
2.Session和Cookie的關系
當前維持會話狀態的途徑有且只有兩種種
第一種:Cookie,最常見的,95%以上的會話都是Cookie的功勞.
第二種:URL重寫,把SessionID附加到URL中,JSP實現了但用的不多.
如果你用過session,你可能很奇怪:我們一般都是用session維持會話,這里怎么沒有?
答案很簡單:上面兩種都是途徑,Session是我們的目的.一句話概括Session和Cookie的關系:Cookie是維持Session最常見的一種途徑.
3.Cookie的過期和Session的超時
你可以自己設置Cookie的過期(其實是服務器替你設置的),如果你設置為用不過期,
以后就都不用再重新登陸了,如果這臺機器就你一個人用完全可以這樣設置,否則
最好不要這樣設置.如果你很長時間沒有反應,就是沒有新的請求,Session就有可能
過期,你可能遇到這樣的情況:明明已經登錄了,過了一會兒回來卻說我沒有登錄
提示重新登錄.就是因為Session過期了,服務器可以設置過期的時間.
4.禁用了Cookie如何實現會話
如果客戶端完全禁用Cookie,將會發生什么現象:
對于ASP,無法跟蹤會話,也就是每個請求都當作新的請求.
對于JSP,可以通過重寫URL實現會話,session.encodeURL(String path)
session.encodeURL("index.jsp")=index.jsp;jsessionid=431D980051204FC8DC3
BF75840F7AF71
可以看到后面的sessionid并沒有包括在QueryString中(在?后面)
對于ASP.NET 同樣支持重寫URL,學習JSP的,不過JSP并不是所有的WebServer都支持重寫URL
5.QueryString和HiddenForm
你可能覺得他們也可以維持會話,但是事實上是不可以的,他們只能傳遞參數。不過在ASP.NET中的服務器事件模型廣泛了使用了Hidden來表示控件的viewState(這個也是ASP.NET比ASP,JSP先進的地方,是一種全新的技術)
為什么他們只能傳遞參數而不能實現會話呢?大致過程是這樣的:
服務器接收到一個請求,如果沒有獲得SessionID,就產生一個新的會話.可能你認為這樣可以保持會話 url?sessionid=234234234234.
這是一個誤區,因為服務器已經處在一個新的會話中了,只不過可以獲得上次會話的ID號而已.
6.QueryString和HiddenForm的區別
QueryString是URL中問號后面的?querystring.一般瀏覽器都把URL限制在255個字符以內所以沒辦法傳遞大量的數據,方法必須為get.HiddenForm是表單數據,方法為可以是get或者post(一般用post)
7.誤區
我看到有人在論壇上說在自己的Web服務器上構建一個Session,然后鏈接到別人的程序這樣可以越過驗證.Session只在同一個 Application中才有效,所以這個設想是徒勞的,不過如果你們的程序是同一個Application中的(比如一些個人主頁空間就有可能)是可以 這樣做的.
8.題外話
利用Cookie攻擊,因為客戶端完全禁用Cookie之后,每次請求服務器都要產生一個會話.如果會話超時時間是15分鐘的話,我們通過完全禁用Cookie的方法在15分鐘內不停的請求讓服務器產生大量的會話,實行DOS攻擊(前提是大量的請求和服務器不做過濾)