精品人妻少妇一区二区老女人_欧美精品视频第一区_中文字幕一区二区无码_蘑菇精品嫩草影院88av

文章分享

開放、平等、協(xié)作、快速、分享

當前位置:首頁>文章分享

淺談Cookie與Session技術

摘錄:HCTech 無錫和控電子   時間:2020-08-07   訪問量:4148

一、什么是狀態(tài)管理

將客戶端與服務器之間多次交互當做一個整體來看,并且將多次交互所涉及的數(shù)據(jù)(狀態(tài))保存下來。

會話:當用戶打開瀏覽器,訪問多個WEB資源,然后關閉瀏覽器的過程,稱之為一個會話,選項卡,彈出頁面都屬于這個會話,且共享同一個session。

注意:具體會話和瀏覽器版本,廠商有關,如IE7及以下,每開一個瀏覽器都創(chuàng)建一個新的session,而IE8及以上,則實現(xiàn)多個瀏覽器共享同一個session。因為IE8及以上,都共享同一個進程,只開辟一個內(nèi)存空間。目前較多主流的瀏覽器都實現(xiàn)同一臺主機上的多個瀏覽器,共享同一個進程。

二、如何進行狀態(tài)管理

方式一:將狀態(tài)保存在客戶端。方式二:將狀態(tài)保存在服務器端。

三、cookie技術(客戶端技術)

(1)什么是cookie

a、cookie是一種客戶端的狀態(tài)管理技術b、當瀏覽器向服務器發(fā)送請求的時候,服務器會將少量的數(shù)據(jù)以set-cookie消息頭的方式發(fā)送給瀏覽器,當瀏覽器再次訪問服務器時,會將這些數(shù)據(jù)以cookie消息頭的方式發(fā)送給服務器。

(2)如何創(chuàng)建一個cookie

Cookie c = new Cookie(String name,String value);response.addCookie(c);默認情況下,cookie保存在瀏覽器內(nèi)存中

(3)cookie的查詢

Cookie[] cookie = request.getCookies();

注意:該方法有可能返回nullString cookie.getName():查找cookie的名字String cookie.getValue():查找cookie的值

(4)cookie的生存時間

cookie.setMaxAge(int seconds):cookie的保存時間seconds>0:瀏覽器會將cookie保存在硬盤上,超過指定時間會刪除該cookieseconds<0:缺省值,只將cookie保存在內(nèi)存中,只要瀏覽器不關閉,cookie就一致保存,瀏覽器一旦關閉,cookie就會被清空。seconds=0:立即刪除cookie,如要刪除一個叫userID的cookie,那么可以這么做:Cookiec = new Cookie("userID","");c.setMaxAge(0);response.addCookie(c);

(5)cookie的編碼問題

cookie只能保存ascii字符,對于不合法的字符(如中文)需要轉換成ascii碼

例:Cookie cookie3 = new Cookie("realname",URLEncoder.encode("姓名","utf-8"));

(6)cookie的路徑問題

a、什么是cookie的路徑問題?瀏覽器在向服務器發(fā)送請求時,會比較cookie的路徑要與訪問的服務器的路徑是否匹配,只有匹配的cookie才會發(fā)送給服務器。b、cookie的默認路徑默認路徑等于創(chuàng)建該cookie的組件路徑c、匹配規(guī)則瀏覽器要訪問的路徑必須是cookie的路徑或者其子路徑時,才會發(fā)送對應的cookied、設置cookie的路徑cookie.setPath(String path)如:cookie.setPath("/appname");這樣保證這個cookie可以被整個web應用訪問。

(7)cookie域

setDomain:設置cookie域,指的是訪問某個域的時候,才會帶入cookie,訪問其他域,不會帶入cookie。默認會禁止該設置,因為安全性較差,如,訪問baidu.com,baidu.com寫一個域是google.com的cookie,那么訪問google.com的時候會帶入baidu.com的cookie,從而會實現(xiàn)攻擊的效果。

(8)cookie的限制

a、cookie可以被用戶禁止b、cookie不完全,敏感數(shù)據(jù),比如密碼、賬號等需要加密。c、cookie的大小有限制,大約為4K左右d、cookie的個數(shù)也有限制,大約是300個左右e、每個站點最多保存20個cookief、cookie只能夠保存字符串。

四、session技術(服務器端)

(1)什么是session?

a、session是一種服務器端的狀態(tài)管理技術。b、session是基于cookie的技術。c、當瀏覽器訪問服務器時,服務器會創(chuàng)建一個session對象(該對象有一個唯一的id號,稱之為sessionId)服務器在默認的情況下,會將sessionId以cookie的方式,發(fā)送給瀏覽器,瀏覽器會將sessionId保存到內(nèi)存中。當瀏覽器再次訪問服務器時,會將sessionId發(fā)送給服務器,服務器依據(jù)sessionId就可以找到之間創(chuàng)建的session對象。

(2)如何獲取session對象?

方式一:HttpSession s = request.getSession(boolean flag);當flag=true時,服務器會先查看請求當中有沒有sessionId,如果沒有,則創(chuàng)建一個session對象。如果有,會依據(jù)sessionId查找對應的session對象。如果找到,則返回該session對象,如果找不到,則創(chuàng)建一個新的session對象。當flag=false時,服務器會先查看請求當中有沒有sessionId,如果沒有則返回null,如果有,會依據(jù)sessionId查找對應的session對象。如果找到,則返回該session對象,如果找不到,返回null。方式二:HttpSession s = request.getSession();等價于request.getSession(true);

(3)常用方法

String serssion.getId();// 得到session的ID

session.setAttribute(String name,Object obj);// obj最好實現(xiàn)序列化Serializable接口,應為服務器在持久化session時,會使用java序列化協(xié)議。

session.getAttribute(String name);// 如果name不存在則返回null

session.removeAttribute(String name);// 刪除session中的指定屬性

(4)session超時

所謂session的超時,指的是服務器會將空閑時間過長的session對象從內(nèi)存空間刪除掉,原因是過多的session對象會影響程序的正常運行,會占用服務器的內(nèi)存空間。大部分服務器都會有一個缺省的超時限制,一般是30分鐘,可以修改服務器的缺省超時限制。如修改tomcat的session超時時間,可以在conf/web.xml中的

<session-config><session-timeout>30</session-timeout></session-config>

也可以將以上配置放到某個WEB應用的web.xml中,這樣可以特定設置某個WEB應用的session超時時間。另外,還可以通過session.setMaxInactiveInterval(int seconds);設置session的超時時間。

(5)session的生命周期

session的創(chuàng)建:當用戶訪問某個可以創(chuàng)建session的servlet的時候,該servlet才會創(chuàng)建session。當session超過默認時間或用戶指定的session時間后,session才會消亡。

(6)刪除session

session.invalidate();

(7)持久化session方案

session默認是存儲在瀏覽器內(nèi)存中,默認時間是30分鐘(根據(jù)不同的WEB服務器設置而定)。且session也是通過cookie來實現(xiàn)發(fā)送到瀏覽器內(nèi)存中的。所以可以考慮用cookie來替換該session。如果用戶在中途關閉瀏覽器的話,那么session就隨著瀏覽器內(nèi)存的釋放而釋放,那么如果想持久化session的話,可以考慮使用cookie技術。

Step1、獲取sessionID。Step2、通過JSESSIONID,然后將sessionID的值寫入cookie,在通過設置保存時間,路徑,來持久化該session。

(8)URL地址編碼(用戶禁用cookie的解決辦法)

如果用戶禁用了cookie,那么在編寫超鏈接的時候,必須使用URL編碼,即:

response. encodeURL(url);

什么是URL重寫?

簡單的說,如果某個組件需要session機制的支持,且用戶禁止了cookie,則不能直接使用該組件的地址去訪問,而應該使用服務器生成的組件的地址(會在組件的地址后面添加sessionId)去訪問。如何重寫?

用在連接地址,表單提交地址。

response.encodeURL(String url);

如果是重定向。

sesponse.encodeRedirectURL(“l(fā)ist.jsp”);

這樣編譯過的URL地址就會自動在后面添加用戶session的id號,那么所有的連接地址就會按如下格式進行輸出,即每個地址都記錄了用戶的信息:

href='/JavaWeb/servlet/BuySession;jsessionid=283087307F0E79CC62208BDCF79FC52A'

這種方式不能實現(xiàn)用戶數(shù)據(jù)持久化。

(9)session的相關細節(jié)

如果即使用了URL地址編碼,也設置了寫出cookie,那么第一次訪問的時候服務器會即帶入cookie同時也進行URL地址編碼,當再次訪問服務器時,服務器已經(jīng)判斷出了瀏覽器是否禁用了cookie,如果沒有禁用,則使用cookie寫入的方式,如果禁用了則使用URL地址編碼的方式

(10)session的優(yōu)缺點

優(yōu)點:1、session相對安全。2、session能夠保存的數(shù)據(jù)類型更豐富。3、session能夠保存的數(shù)據(jù)大小沒有限制。

缺點:1、session需要將所有數(shù)據(jù)寫在服務器端,所以服務器會占用過多的內(nèi)存空間,會影響服務器性能??梢钥紤]使用cookie或數(shù)據(jù)庫來保存數(shù)據(jù)。

(11)session案例

a、session登錄驗證

step1、在登錄成功以后,在session對象上綁定數(shù)據(jù),比如:session.setAttribute(“user”,user);step2、對需要保護的資源(只有登錄成功以后才能訪問的資源,比如主頁),添加session驗證代碼:Object obj = session.getAttribute(“user”);If(obj==null)就跳轉到登錄界面

b、驗證碼生成一個驗證碼,然后將驗證碼存儲到session中,然后從session中取出驗證碼與客戶提交的驗證碼進行比對,這是一個典型的session應用。


上一篇:Cookie與Session有何異同?

下一篇:抓包分析SSL/TLS連接建立過程【總結】

在線咨詢

點擊這里給我發(fā)消息 售前咨詢專員

點擊這里給我發(fā)消息 售后服務專員

在線咨詢

免費通話

24小時免費咨詢

請輸入您的聯(lián)系電話,座機請加區(qū)號

免費通話

微信掃一掃

微信聯(lián)系
返回頂部