java 登录session_JavaWeb Session详解
記得把這幾點(diǎn)描述好咯:代碼實(shí)現(xiàn)過程 + 項(xiàng)目文件結(jié)構(gòu)截圖 + ## Session的由來
上一篇博文介紹了Cookie的相關(guān)知識(shí),其中介紹了必須采用一種機(jī)制來唯一標(biāo)識(shí)一個(gè)用戶,同時(shí)記錄該用戶的狀態(tài)。
于是就引入了第一種機(jī)制:Cookie機(jī)制;那么第二種就是Session機(jī)制。
Session機(jī)制:采用的是在服務(wù)器端保持Http狀態(tài)信息的方案。結(jié)合兩篇博文也可以看出兩種機(jī)制最明顯的區(qū)別就是cookie是存儲(chǔ)子在客戶端,
而Session是存儲(chǔ)在服務(wù)器端。具體兩者的區(qū)別我會(huì)在下一篇博文詳細(xì)介紹。
Session的定義即基本介紹
Session,有始有終的一系列動(dòng)作/消息的意思,其實(shí)我們舉一個(gè)小例子來說:比如我們一次打電話,從接起電話到你掛斷電話的一系列過程可以稱為一個(gè)Session。
Session在Web開發(fā)環(huán)境下的語義又有了新的擴(kuò)展,它的含義是指一類用來在客戶端與服務(wù)器端之間保持狀態(tài)的解決方案。
有時(shí)候Session也用來指這種解決方案的存儲(chǔ)結(jié)構(gòu)。
Session存儲(chǔ)方式
服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來保存信息。
Session標(biāo)識(shí)傳遞的過程
當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session時(shí),服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否包含了一個(gè)session標(biāo)識(shí)(即sessionId),
如果已經(jīng)包含一個(gè)sessionId則說明以前已經(jīng)為此客戶創(chuàng)建過session,服務(wù)器就按照session id把這個(gè)session檢索出來使用(如果檢索不到,
可能會(huì)新建一個(gè),這種情況可能出現(xiàn)在服務(wù)端已經(jīng)刪除了該用戶對(duì)應(yīng)的session對(duì)象,但用戶人為地在請(qǐng)求的URL后面附加上一個(gè)JSESSION的參數(shù))。
如果客戶請(qǐng)求不包含sessionId,則為此客戶創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的sessionId,這個(gè)sessionId將在本次響應(yīng)中返回給客戶端保存。
下面是流程圖:
Session的幾種存儲(chǔ)方式
使用Cookie: 保存session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)送給服務(wù)器,這種cookie稱為session cookie。
如下圖:
URL重寫: 由于cookie可以被人為的禁用,必須有其它的機(jī)制以便在cookie被禁用時(shí)仍然能夠把session id傳遞回服務(wù)器,
經(jīng)常采用的一種技術(shù)叫做URL重寫,就是把session id附加在URL路徑的后面,附加的方式也有兩種,一種是作為URL路徑的附加信息,
另一種是作為查詢字符串附加在URL后面。網(wǎng)絡(luò)在整個(gè)交互過程中始終保持狀態(tài),就必須在每個(gè)客戶端可能請(qǐng)求的路徑后面都包含這個(gè)session id。
如下圖:
Session的創(chuàng)建與刪除
Session創(chuàng)建
(1). 對(duì)于Jsp: 若當(dāng)前頁面為瀏覽器(客戶端)訪問web應(yīng)用的第一個(gè)資源頁面且Jsp的Page指定的Session屬性的值為true。
(2). 對(duì)于Servlet: 若當(dāng)前Servlet為瀏覽器(客戶端)訪問web應(yīng)用的第一個(gè)資源時(shí),使用request.getSession()或request.getSession(true)創(chuàng)建。
Session刪除
(1). 調(diào)用session.invalidate()方法
(2). 卸載web應(yīng)用程序
(3). 超過了HttpSession的過期時(shí)間
Session的超時(shí)管理
WEB服務(wù)器無法判斷當(dāng)前的客戶端瀏覽器是否還會(huì)繼續(xù)訪問,也無法檢測客戶端瀏覽器是否關(guān)閉,所以,即使客戶已經(jīng)離開或關(guān)閉了瀏覽器,
WEB服務(wù)器還要保留與之對(duì)應(yīng)的HttpSession對(duì)象。
隨著時(shí)間的推移而不斷增加新的訪問客戶端,WEB服務(wù)器內(nèi)存中將會(huì)因此積累起大量的不再被使用的HttpSession對(duì)象,并將最終導(dǎo)致服務(wù)器內(nèi)存耗盡。
WEB服務(wù)器采用“超時(shí)限制”的辦法來判斷客戶端是否還在繼續(xù)訪問,如果某個(gè)客戶端在一定的時(shí)間之內(nèi)沒有發(fā)出后續(xù)請(qǐng)求,WEB服務(wù)器則認(rèn)為客戶端已經(jīng)停止了活動(dòng),
結(jié)束與該客戶端的會(huì)話并將與之對(duì)應(yīng)的HttpSession對(duì)象變成垃圾。
如果客戶端瀏覽器超時(shí)后再次發(fā)出訪問請(qǐng)求,WEB服務(wù)器則認(rèn)為這是一個(gè)新的會(huì)話的開始,將為之創(chuàng)建新的HttpSession對(duì)象和分配新的會(huì)話標(biāo)識(shí)號(hào)。
會(huì)話的超時(shí)間隔可以在web.xml(Tomcat服務(wù)器或者web應(yīng)用程序)文件中設(shè)置,其默認(rèn)值由Servlet容器定義。
30
具體實(shí)現(xiàn)
登錄頁面代碼實(shí)現(xiàn)
SessionId:
isCreateNew:
maxInActiveInterval:
CreatedTime:
lastAccessedTime:
Object username = session.getAttribute("username");
if(username == null){
username = "";
}
%>
" method="post">username:
登錄成功頁面代碼實(shí)現(xiàn)
SessionId:
isCreateNew:
maxInActiveInterval:
CreatedTime:
lastAccessedTime:
Hello:
//將username存儲(chǔ)于session之中,便于在整個(gè)會(huì)話過程中記住當(dāng)前user;
// 當(dāng)然服務(wù)器端可以找到session還是通過cookie(URL重寫)在客戶端和服務(wù)器端傳遞JSESSIONID
session.setAttribute("username", request.getParameter("username"));
%>
">重新登錄
">注銷
注銷頁面實(shí)現(xiàn)
SessionId:
isCreateNew:
maxInActiveInterval:
CreatedTime:
lastAccessedTime:
ByeBye:
//注銷session
session.invalidate();
%>
重新登錄
How to run code
將代碼clone到本地,使用eclipse導(dǎo)入代碼,導(dǎo)入的時(shí)候項(xiàng)目的類型選擇"git project"。
右鍵項(xiàng)目 run on Server。
法二: 將項(xiàng)目中WebContent中的內(nèi)容拷入你的Tomccat服務(wù)器下的webapps目錄下你建的站點(diǎn)名,
然后啟動(dòng)tomcat服務(wù)器,
在瀏覽器中輸入: http://localhost:8080/站點(diǎn)名,即可訪問
站點(diǎn)頁面展示
login頁面
loginSuccess頁面
loginOut頁面
項(xiàng)目文件結(jié)構(gòu)截圖
疑問聯(lián)系
個(gè)人博客:http://blog.tommyyang.cn
個(gè)人郵箱:tingzai.yang@gmail.comJavaWeb Session詳解
注:本文著作權(quán)歸作者,由demo大師代發(fā),拒絕轉(zhuǎn)載,轉(zhuǎn)載需要作者授權(quán)
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java 登录session_JavaWeb Session详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是java泛型_java泛型背后是什
- 下一篇: java spring框架 注解_详解J