利用JSP session對(duì)象保持住登錄狀態(tài)
http協(xié)議本身是一種無(wú)狀態(tài)的協(xié)議,也就是客戶端連續(xù)發(fā)送的多個(gè)請(qǐng)求之間沒(méi)有聯(lián)系,下一次請(qǐng)求不關(guān)心上一次請(qǐng)求的狀態(tài)。
而實(shí)際運(yùn)用中卻希望服務(wù)器能記住客戶端請(qǐng)求的狀態(tài),比如在網(wǎng)上購(gòu)物系統(tǒng)中,服務(wù)器端應(yīng)該能夠識(shí)別并跟蹤每個(gè)登錄到系統(tǒng)中的用戶挑選并購(gòu)買商品的整個(gè)流程 。為此,web服務(wù)器必須采用一種機(jī)制來(lái)唯一地標(biāo)識(shí)一個(gè)用戶,同時(shí)記錄該用戶的狀態(tài),這就要用到會(huì)話跟蹤技術(shù)。
Java Web使用Session來(lái)跟蹤會(huì)話和管理會(huì)話內(nèi)的狀態(tài)。
Session對(duì)象是一個(gè)jsp內(nèi)置對(duì)象,它在第一個(gè)jsp頁(yè)面被裝載時(shí)自動(dòng)創(chuàng)建,完成會(huì)話期管理。
從一個(gè)客戶打開瀏覽器并連接到服務(wù)器開始,到客戶關(guān)閉瀏覽器離開這個(gè)服務(wù)器結(jié)束,被稱為一個(gè)會(huì)話。當(dāng)一個(gè)客戶訪問(wèn)一個(gè)服務(wù)器時(shí),可能會(huì)在這個(gè)服務(wù)器的幾個(gè)頁(yè)面之間反復(fù)連接,反復(fù)刷新一個(gè)頁(yè)面,服務(wù)器應(yīng)當(dāng)通過(guò)某種辦法知道這是同一個(gè)客戶,這就需要session對(duì)象。
當(dāng)發(fā)生以下四種情形其中之一時(shí),session對(duì)象中的數(shù)據(jù)便會(huì)清空 :
用戶關(guān)閉目前正在使用的瀏覽器程序。
關(guān)閉網(wǎng)頁(yè)服務(wù)器。
用戶未向服務(wù)器提出請(qǐng)求超過(guò)預(yù)設(shè)的時(shí)間,Tomcat服務(wù)器預(yù)設(shè)為30分鐘。
運(yùn)行程序結(jié)束session。
1.建立session變量
在JSP中不需要特別設(shè)置程序代碼來(lái)建立用戶session,當(dāng)程序使用了session對(duì)象時(shí),便會(huì)自動(dòng)建立session,而下面這行語(yǔ)句便是在session中新增變量數(shù)據(jù)的方式:
session.setAttribute(“變量名稱”,變量?jī)?nèi)容)
變量?jī)?nèi)容可為字符串或者其他對(duì)象類型,接著讓我們來(lái)看看如何使用這個(gè)方法在session中設(shè)置變量數(shù)據(jù):
<% session.setAttribute(“id”,”編號(hào)”); //設(shè)置字符串 session.setAttribute(“expire”,new Date(86400*10)); //設(shè)置日期 session.setAttribute(“l(fā)evel”,new Integer(3)); //設(shè)置整數(shù) %>
2.返回session中的變量
在session中設(shè)置了變量數(shù)據(jù)后,在其他的各個(gè)網(wǎng)頁(yè)中便可使用getAttribute讀取其中的內(nèi)容,此方法所返回的數(shù)據(jù)類型為對(duì)象(Object)類型,語(yǔ)法如下:
session.getAttribute(“變量名稱”)
3.返回所有session中的變量名稱
getAttributeNames()方法可以取出session中所有變量的名稱,其結(jié)果為一個(gè)枚舉類的實(shí)例。語(yǔ)法為:
session.getAttributeNames()
4.清除session中的變量
removeAttribute()方法可以清除session中的變量數(shù)據(jù),使用語(yǔ)法如下:
session.removeAttribute(“變量名稱”)
5.結(jié)束session
對(duì)于已經(jīng)建立的session,可使用invalidate()方法將其結(jié)束,使用語(yǔ)法為:
session.invalidate()
其他的一些可能會(huì)用到的方法:
現(xiàn)在寫一個(gè)實(shí)例:通過(guò)session來(lái)記錄客戶的登錄狀態(tài):
index.jsp登錄界面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form action="process_login.jsp" method="post"> 用戶名:<input type="text" name="username"> 密碼:<input type="text" name="password"> <input type="submit" value="submit"> <input type="reset" value="reset"> </form> <a href="page1.jsp" rel="external nofollow" rel="external nofollow" >1</a> <a href="page2.jsp" rel="external nofollow" rel="external nofollow" >2</a> <a href="page3.jsp" rel="external nofollow" rel="external nofollow" >3</a> </body> </html>
process_login.jsp處理登錄數(shù)據(jù),這里知道輸入密碼是123都可以登錄成功:
session.getAttribute()將會(huì)告訴page1.jsp文件這個(gè)用戶是否登錄成功了
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String username=request.getParameter("username"); String password=request.getParameter("password"); if (password.equals("123")){ session.setAttribute("username",username); } response.sendRedirect("page1.jsp"); %>
logout.jsp登出
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% session.invalidate(); response.sendRedirect("index.jsp"); %>
page1.jsp, page2.jsp, page3.jsp大同小異顯示不同的頁(yè)面,用于驗(yàn)證登錄狀態(tài)的記錄(這里僅以page1.jsp為例):
注意這里的判斷邏輯是一種很有趣的寫法,把jsp代碼和html代碼完全融合起來(lái)了,不過(guò)我覺(jué)得這樣寫還是比較亂,寧愿只用一個(gè)jsp代碼段,里面用out.println()在html中來(lái)實(shí)現(xiàn)顯示不同的內(nèi)容
這里主要是靠判斷session.username是否為空來(lái)判斷是否登錄過(guò)了,并且傳遞相關(guān)的參數(shù)信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 這里是Page1<br> <%if (session.getAttribute("username")==null){%> 用戶還沒(méi)有登錄 <%}else {%> 已登錄,用戶名:<%= session.getAttribute("username")%> <%}%> <br> <a href="page1.jsp" rel="external nofollow" rel="external nofollow" >page1</a> <a href="page2.jsp" rel="external nofollow" rel="external nofollow" >page2</a> <a href="page3.jsp" rel="external nofollow" rel="external nofollow" >page3</a> <a href="index.jsp" rel="external nofollow" >login</a> <a href="logout.jsp" rel="external nofollow" >logout </a> </body> </html>
可以看到,登錄以后,不管跳轉(zhuǎn)到哪個(gè)頁(yè)面,用戶的登錄狀態(tài)都沒(méi)有丟失
一旦logout登出以后,session.invalidate()方法被調(diào)用,session被銷毀,就跟蹤不到用戶的登錄信息了
同時(shí),如果我采用另一個(gè)瀏覽器訪問(wèn)同樣的頁(yè)面,以“2號(hào)用戶”為username登錄,也會(huì)一直記錄到這個(gè)用戶的登錄信息(不過(guò)如果是同一種瀏覽器的話就不行了)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于IIS連接數(shù)和在線人數(shù)的詳細(xì)說(shuō)明
這篇文章主要為大家介紹下IIS連接數(shù)和在線人數(shù)的詳細(xì)說(shuō)明需要的朋友可以參考下2006-10-10JSP連接MySql/MS SQL Server/Oracle數(shù)據(jù)庫(kù)連接方法[整理]
這個(gè)經(jīng)常整理更新2008-10-10jsp+ajax實(shí)現(xiàn)的局部刷新較驗(yàn)驗(yàn)證碼(onblur事件觸發(fā)較驗(yàn))
這篇文章主要介紹了jsp+ajax實(shí)現(xiàn)的局部刷新較驗(yàn)驗(yàn)證碼,基于onblur事件觸發(fā)較驗(yàn)功能,以實(shí)例形式詳細(xì)的分析了前臺(tái)顯示、圖片生成及Ajax動(dòng)態(tài)驗(yàn)證等詳細(xì)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Hibernate識(shí)別數(shù)據(jù)庫(kù)特有字段實(shí)例詳解
這篇文章主要介紹了Hibernate識(shí)別數(shù)據(jù)庫(kù)特有字段實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06詳解JSP 內(nèi)置對(duì)象request常見用法
這篇文章主要介紹了詳解JSP 內(nèi)置對(duì)象request常見用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09JSP隱含對(duì)象response實(shí)現(xiàn)文件下載的兩種方法
JSP隱含對(duì)象response實(shí)現(xiàn)文件下載的兩種方式,二進(jìn)制文件的下載與文本文件下載2014-09-09