點擊關注,快速進階高級架構師
作者:Zender
一、會話的概念會話可簡單理解為:用戶開一個瀏覽器,點擊多個超鏈接,訪問服務器多個web資源,然后關閉瀏覽器,整個過程稱之為一個會話。
二、會話過程中要解決的一些問題每個用戶在使用瀏覽器與服務器進行會話的過程中,不可避免各自會產生一些數據,程序要想辦法為每個用戶保存這些數據。
三、保存會話數據的兩種技術1、Cookie
Cookie意為"甜餅",是由W3C組織提出,最早由Netscape社區發展的一種機制。目前Cookie已經成為標準,所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一種無狀態的協議,服務器單從網絡連接上無從知道客戶身份。怎么辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工作原理。
Cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用respon向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還可以根據需要修改Cookie的內容。
2、Session
Session是服務器端技術,利用這個技術,服務器在運行時可以為每一個用戶的瀏覽器創建一個其獨享的ssion對象,由于ssion為用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數據放在各自的ssion中,當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的ssion中取出數據為用戶服務。
四、Cookie類的主要方法respon接口也中定義了一個addCookie方法,它用于在其響應頭中增加一個相應的Set-Cookie頭字段。 同樣,request接口中也定義了一個getCookies方法,它用于獲取客戶端提交的Cookie。
五、Cookie使用1、使用cookie記錄用戶上一次訪問的時間
第一次訪問時,如下所示:
再次訪問:
2、刪除Cookie
3、cookie中存/取中文
結果如下:
Cookie注意細節
1,一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。
2,一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。
3,瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
4,如果創建了一個cookie,并將他發送到瀏覽器,默認情況下它是一個會話級別的cookie(即存儲在瀏覽器的內存中),用戶退出瀏覽器之后即被刪除。若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,并給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。
六、Session簡單介紹在WEB開發中,服務器可以為每個用戶瀏覽器創建一個會話對象(ssion對象),注意:一個瀏覽器獨占一個ssion對象(默認情況下)。因此,在需要保存用戶數據時,服務器程序可以把用戶數據寫到用戶瀏覽器獨占的ssion中,當用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的ssion中取出該用戶的數據,為用戶服務。
Session和Cookie的主要區別
1,Cookie是把用戶的數據寫給用戶的瀏覽器。
2,Session技術把用戶的數據寫到用戶獨占的ssion中。
3,Session對象由服務器創建,開發人員可以調用request對象的getSession方法得到ssion對象。
七、Session基礎知識Session是服務器端技術,利用這個技術,服務器在運行時可以為每一個用戶的瀏覽器創建一個其獨享的ssion對象,由于ssion為用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數據放在各自的ssion中,當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的ssion中取出數據為用戶服務。
當用戶打開瀏覽器,訪問某個網站操作ssion時,服務器就會在服務器的內存為該瀏覽器分配一個ssion對象,該ssion對象被這個瀏覽器獨占。
這個ssion對象也可以看做是一個容器,ssion默認存在時間為30min,你可以修改。
1、Session可以用來做什么
1、網上商城中的購物車
2、保存登錄用戶的信息
3、將某些數據放入到Session中,供同一用戶的各個頁面使用
4、防止用戶非法登錄到某個頁面。
2、Session基本使用
Servlet1:
Servlet2:
同一瀏覽器訪問Servlet1,再訪問Servlet2,結果如下:
不同瀏覽器訪問Servlet1,再訪問Servlet2,結果如下:
可以看到這時候name是null,也就是沒有從ssion對象中取出值,因為360瀏覽器并沒有運行Servlet1來創建Session對象,上面的ssion對象是Chrome瀏覽器獨占的。
3、Session生命周期
Session中的屬性的默認生命周期是30min,這個默認時間可以通過修改web.xml文件來修改
1,在Tomcat根目錄confweb.xml文件中修改
<ssion-config> <ssion-timeout>30</ssion-timeout></ssion-config>
2,如果只需要對某一個web應用設置,則只需要修改對應web應用的web.xml文件。在這個web.xml文件中添加如上的代碼:
<ssion-config> <ssion-timeout>10</ssion-timeout></ssion-config>
除了設置默認生命周期之外,最重要的是在程序中設置,調用tMaxInacttiveInterval(int interval),這里的interval是以秒為單位的,而且這個方法設置的是發呆時間,比如你設置的是60秒,那么在這60秒之內如果你沒有操作過ssion,它就會自動刪除,如果你操作過,不管是設置屬性還是讀取屬性,它都會從頭開始計時。
ssion.tMaxInactiveInterval(60);八、Session實現原理
服務器是如何實現一個ssion為一個用戶瀏覽器服務的?
1,瀏覽器A先訪問Servlet1,這時候它創建了一個Session,ID號為110,然后Servlet1將這個ID號以Cookie的方式返回給瀏覽器A。
2,瀏覽器A繼續訪問Servlet2,那么這個請求會帶上Cookie值: JSESSIONID=110,然后服務器根據瀏覽器A傳遞過來的ID號找到內存中的這個Session。
3,瀏覽器B來訪問Servlet1了,它的請求并沒有帶上 JSESSIONID這個Cookie值,由于它也要使用Session,所以服務器會新創建一個Session,ID號為111。
4,瀏覽器B繼續訪問Servlet2,那么這個請求會帶上Cookie值: JSESSIONID=111,然后服務器根據瀏覽器B傳遞過來的ID號找到內存中的這個Session。
例如:
Servlet1:
Servlet2:
第一次訪問Servlet1時,服務器會創建一個新的sion,并且把ssion的Id以cookie的形式發送給客戶端瀏覽器,如下圖所示:
可以看到,Request Headers中并沒有Cookie的信息,而Respon Headers中有這么一句話:
Set-Cookie:JSESSIONID=05A94199DDC64311563740CC2C78D656; Path=/CookieAndSession/; HttpOnly
說明這個時候服務器向客戶端通過Cookie傳遞回了 JSESSIONID這個屬性。
然后訪問Servlet2,如下圖所示:
可以看到Respon Headers中沒有出現Set-Cookie這個頭,而Request Headers中帶上了Cookie這個頭:
Cookie:JSESSIONID=05A94199DDC64311563740CC2C78D656
而這個頭中正包含 JSESSIONID,并且它的值也就是我們之前Set-Cookie中 JSESSIONID的值。
這就證明了我們之前圖解的Session的原理,也就是服務器能夠為不同的瀏覽器區分不同的Session的機制。
九、Session的簡單應用1,用戶登錄時候驗證驗證碼
Index.jsp:
CodeServlet:
Web.xml:
這里使用了jelly-core-1.7.0.GA.jar來生成了驗證碼,具體使用方式:
jelly-core-1.7.0.GA.jar(http://www.blogjava.net/fancydeepin/archive/2014/08/03/jelly_image.html)
訪問http://localhost:8081/CookieAndSession/index.jsp輸入驗證碼,點擊提交:
輸入正確驗證碼,頁面響應結果:
輸入錯誤驗證碼,頁面響應結果:
輸入正確驗證碼,后臺結果:
輸入錯誤驗證碼,后臺結果:
2,實現簡易購物車
模擬一個數據庫:
BuyBookServlet這個Servlet用于購買圖書:
運行結果:
3,防止用戶非法登錄到某個頁面
比如我們的用戶管理系統,必須要登錄成功后才能跳轉到主頁面,而不能直接繞過登錄頁面直接到主頁面,這個應用是一個非常常見的應用。
當在驗證用戶的控制器LoginClServlet.java驗證用戶成功后,將當前的用戶信息保存在Session對象中:
然后在主頁面Main.java最開始的地方,取出Session中的登錄用戶信息,如果信息為空,則為非法訪問,直接跳轉到登錄頁面,并提示相關信息:
那么這里就存在一個問題,一個網站會有很多個需要防止非法訪問的頁面,如果都是用這種方法豈不是很麻煩?
兩種解決辦法:
第一種:將這段驗證用戶的代碼封裝成函數,每次調用
第二種:使用過濾器
4,利用Session防止表單重復提交
具體的做法:
在服務器端生成一個唯一的隨機標識號,專業術語稱為Token(令牌),同時在當前用戶的Session域中保存這個Token。然后將Token發送到客戶端的Form表單中,在Form表單中使用隱藏域來存儲這個Token,表單提交的時候連同這個Token一起提交到服務器端,然后在服務器端判斷客戶端提交上來的Token與服務器端生成的Token是否一致,如果不一致,那就是重復提交了,此時服務器端就可以不處理重復提交的表單。如果相同則處理表單提交,處理完后清除當前用戶的Session域中存儲的標識號。
在下列情況下,服務器程序將拒絕處理用戶提交的表單請求:
1,存儲Session域中的Token(令牌)與表單提交的Token(令牌)不同。
2,當前用戶的Session中不存在Token(令牌)。
3,用戶提交的表單數據中沒有Token(令牌)。
例如:
創建FormTokenServlet,用于生成Token和跳轉到token.jsp頁面:
在token.jsp中使用隱藏域來存儲Token(令牌),提交Token(令牌)到服務器:
TokenServlet處理表單提交:
運行結果如下:
十、用戶禁用Cookie后的Session處理這里存在一種情況,假如用戶瀏覽器禁用了Cookie怎么辦?比如我把Chrome的Cookie禁用,如下:
解決方法:URL重寫
Servlet中的respon提供了對URL重寫的方法:
那么URL重寫是什么意思呢?其實就是人為地把JSESSIONID附在了url的后面,比如我們修改之前寫的簡易購物車,ShowBook中所有的點擊購買超鏈接都要重寫。
之前我們是這么寫的:
out.println("<tr><td>"+book.getName()+"</td><td><a href='"+ req.getContextPath() +"/BuyBookServlet.html?id="+book.getId()+"'>點擊購買</a></td></tr>");
現在進行URL重寫:
req.getSession();String url = "/MyCart/BuyBookCl?id="+book.getId();url = resp.encodeURL(url);out.println("<tr><td>"+book.getName()+"</td><td><a href='"+url+"'>點擊購買</a></td></tr>");
需要注意的是,重寫之前一定要調用或者確保使用過request.getSession()這個方法。
重寫之前,訪問ShowBookServlet的源代碼是這樣的:
重寫之后呢:
可以看到URL重寫之后,jssionid這個參數自動附在了url后面,由此,得以確保我們的Session在Cookie被禁用的情況下繼續正常使用。這時候我們查看購物車的地址欄如下,可以明顯看到jssionid這個參數:
原文:https://www.cnblogs.com/Zender/p/7657516.html
本文發布于:2023-02-28 21:05:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167772345298626.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:jspsession(jspsession實現購物車).doc
本文 PDF 下載地址:jspsession(jspsession實現購物車).pdf
| 留言與評論(共有 0 條評論) |