生活随笔
收集整理的這篇文章主要介紹了
大数据WEB阶段(十二)会话技术、Cookie、Session及两者的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
會話技術 – Cookie與Session及其兩者的區別
(一)會話技術
一、概述
1. 一個瀏覽器為了實現某一個功能對服務器產生了多次請求響應。從第一個請求開始訪問服務器,會話開始,到最后一個頁面訪問結束 關閉所有頁面,這個過程中的所有的請求響應加在一起稱之為 瀏覽器和服務器之間產生了一次會話。
2. 會話技術最重要的是會話中產生的數據如何保存 。
1. request域 – 不合適。request太小了,每一次請求都會產生一個新的request , 后續的請求無法讀取到之前請求的request中存放的數據 。
2. servletContext – 不合適。 所有的會話看到的都是同一個ServletContext域 , 所有會話的數據會混雜在一起
3. cookie – 將會話產生的數據存放在客戶端
4. session – 將會話產生的數據保存在服務器中
(二)Cookie
一、概述
Cookie是客戶端技術 將會話產生的數據保存在客戶端中當瀏覽器訪問服務器 服務器可以通過在響應中增加set-Cookie的響應頭 命令瀏覽器保存一段cookie信息瀏覽器會將cookie信息保存在本地 之后再去訪問服務器時 會自動在請求中 通過cookie請求頭 帶著cookie信息服務器可以通過解析請求中的cookie請求頭 獲取信息 從而獲取到了之前保存的會話相關的數據
二、基本方法
Cookie(String name ,String value) :cookie沒有無參構造方法 , 在創建時就得制定好cookie的名字和值 。 getName() : cookie的名字只能獲取不能修改getValue(String name) : 通過名字獲取對應的值setValue(String name , String value) : 通過名字設置對應的值 。 response.setCookie(Cookie c): 向響應中添加cookierequest.getCookies() : 從請求中獲取所有的cookie
三、cookie保存時長
如果不設置cookie保存時長 , 默認cookie會保存在瀏覽器內存中 , 瀏覽器關時cookie銷毀 , 這種稱之為會話級別的cookie 。 可以通過代碼制定瀏覽器將cookie保存到什么時候 , 瀏覽器收到的 cookie信息中如果包含了cookie超時時間 , 瀏覽器就會把cookie信息以文件的形式保存在瀏覽器的臨時文件夾中 , 保存到指定的時間 , 這段時間內cookie文件一直存在 , 即使對此開關 瀏覽器仍然能夠讀取到這個cookie信息。
設置超時時間
setMaxAge(int time);//單位是秒
獲取超時時間
getMaxAge()
四、瀏覽器訪問哪些路徑時會攜帶cookie
如果不設置 , 默認在訪問發送cookie給瀏覽器的servlet的父一級目錄及子孫目錄時會攜帶這個cookie 。 可以通過代碼設置瀏覽器在訪問哪些路徑時攜帶這個cookie
設置路徑
setPath(String path);
獲取攜帶這個cookie的路徑
getPath();
五、刪除cookie
java提供的Cookie類中本身沒有刪除一個cookie的方法 , 但是可以通過一些方法實現刪除cookie的效果 。 如果想要刪除一個cookie , 需要發送一個和要刪除的cookie名字相同 , path相同 , 但是maxAge為0的cookie 。 原理: 當發送一個與原cookie名字相同 , path也相同的cookie時 , 原cookie將會被覆蓋 , 但是新cookie的maxAge為0 , 即剛被創建就被刪除 , 從而實現了刪除一個cookie 。
六、Cookie其他
一個Cookie只能標示一種信息 , 他至少含有一個標識信息的名字(name)和設置值(value)。 一個WEB站點可以給一個web瀏覽器發送多個cookie , 一個web瀏覽器也可以存儲多個web站點提供的cookie 。 瀏覽器一般只允許存放300個cookie, 且 每個站點最多 能存放20個從cookie , 每個cookie的大小被限制在4KB以內 。 如果創建了一個cookie,并將他發送到瀏覽器,默認情況下它是一個會話級別的cookie(即存儲在瀏覽器的內存中),用戶退出瀏覽器之后即被刪除。若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,并給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。注意:瀏覽器是通過name+path來唯一標示一個cookie的 。 在刪除一個cookie時name和path必須一致 , value可以隨意設置 。
八、案例
登錄時記住用戶名和密碼 。
(三)Session
一、Session概述
session時服務器端會話保存技術 服務器在需要時 , 可以為每個用戶創建一個獨一無二的為該用戶服務的session對象 , 其中保存著該用戶會話相關的數據 。 之后該用戶再來訪問服務器時 , 可以找到志強創建的屬于他的session , 從中找到之前 保存的數據 。 從而實現會話數據的保存 。 由于每個用戶各自有各自的session , 每一個session只為對應的用戶服務 , 所以數據不會產生混亂 。
二、session是一個域對象
生命周期:
當第一次調用request。getSession()方法時表明會話中需要硬session來服務了, 此時服務器會創建一個session對象 , 一直駐留在內存中為當前會話服務 。 session有三種銷毀方式:
自殺: 可以通過明確調用session.invalidate()方法立即殺死當前session 。 壽終正寢 : session默認發呆時間為30分鐘 , 如果超過30分鐘沒有用戶使用這個session , 則服務器會認為這個session超時 , 殺死會話對應的session 。 意外身亡 : 當web應用銷毀時 , session也隨之銷毀 。 作用范圍: 整個會話主要功能: 在會話范圍內共享數據
三、常用方法
創建、獲取session
獲取一個session對象 , 如果當前 會話已經有session對象 , 則直接獲取 , 如果沒有則創建
request.getSession();
當傳入的值為true時 , 與上面的方法相同 ; 如果傳入的參數為false時 , 當前會話存在session時直接獲取 , 不存在時返回null
request.getSession(boolean b);
操作域
//設置session數據
session.setAttribute();
//獲取session數據
session.getAttribute();
//移除session數據
session.removeAttribute();
殺死session
session.invalidate()
四、案例
利用session實現登錄 、 注銷
登錄
所謂的登錄其實就是用戶提交用戶名和密碼 后檢查數據庫如果不正確就跳轉回登錄界面并提示用戶重新輸入如果正確則創建 session保存該用戶的登錄標記在之后的訪問中可以通過 檢查登錄 標記貨值該用戶 是否登錄 , 如果登錄過 ,該用戶是誰 。 注銷
所謂的注銷其實就是殺死session,使session中的登錄標記失效 。 驗證碼校驗
驗證碼圖片生成之后將圖片發送至頁面 , 并且將驗證碼中的內容存入session中備用用戶提交參數后 ,從請求中獲取驗證碼參數 , 再從session中獲取驗證碼 元數據 , 兩者比對如果驗證碼不通過返回注冊頁面 數據回顯數據回顯
數據在發送前被存放在request域中在進行發送如果后臺校驗不通過 , 則請求轉發回注冊頁面 此時request還是發送請求時的那個request , 直接從中取相應的值就行 。
五、session原理
實際上session是基于一個叫做jsessionid的 cookie工作的 。 當瀏覽器訪問服務器調用到request.getSession()時 , 此方法會檢查請求中是否有叫做jsessionid的cookie 。如果沒有 , 則說明這是第一次用到session , 此時服務器會自動創建一個session使用 , 并將sessionid作為name為jsessionid的cookie的值發送給瀏覽器保存 。瀏覽器在后續的訪問中 , 就會帶著 這個jsessionid來訪問 , 后續再調用到request.getSession()時, 此方法會檢查請求中是否有叫做jsessionid的cookie , 如果有則在瀏覽器內存中找jsessionid對應的session使用 。 如果找不到 , 說明session已經被銷毀 ,則創建一個新的session使用 , 并在響應中發送新的jsessionid 。
六、cookie被禁用后session無法被使用的情況
如果禁用了cookie session也就用不了了 - 可以通過URL重寫來解決如果禁用了cookie 瀏覽器不再基于cookie來保存jsessionid 在服務器無法獲取到jsessionid 也就無法找對應的session 所以想解決這個問題 就需要想辦法 將jsessionid的值 帶給服務器。此時可以使用URL重寫的技術來實現URL重寫
所謂的URL的重寫 就是 將地址 改寫 在地址后使用特殊的參數 攜帶jsessionid的技術 。雖然cookie用不了了 但是 通過地址 仍然可以攜帶jsessionid的信息 從而使用session這個技術 需要將應用中所有的地址都要進行URL重寫 相對來說非常麻煩而這么麻煩帶來的唯一的好處是 禁用cookie后仍然可以使用session 似乎并不值得這么麻煩所以 現在很多網站 都不會去做URL重寫 對于禁用cookie的情況 不處理 或者 檢測到用過戶禁用cookie就引導用戶 打開瀏覽器的cookie 再來使用網站示例:
response.encodeURL(String url);
//--如果是普通的地址用這個方法
response.encodeRedirectURL(String url);
//--如果地址是用來進行重定向的,用這個方法
(四)Cookie與session的區別
cookie將會話相關數據保存在客戶端 ; session將會話相關的數據保存在服務器端cookie可以保存的時間比較長; session超過30分種沒人用就銷毀cookie有可能隨著用戶的操作被清除 ;session只要不手動刪除 在存活期間可以可靠的訪問cookie將信息保存在瀏覽器中 可以通過翻臨時文件夾 查看cookie中的數據 不安全; session將會話相關的數據保存在服務器內存中 安全性高很高。如果需要將會話數據保存的很久 – cookie如果希望會話數據不會因為用戶的操作丟失 – session如果會話數據比較在意安全性 – session
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的大数据WEB阶段(十二)会话技术、Cookie、Session及两者的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。