java基礎學習:JavaWeb之Cookie和Session

其餘更多java基礎文章: java基礎學習(目錄)javascript


1、會話概述

1.一、什麼是會話?

會話可簡單理解爲:用戶開一個瀏覽器,點擊多個超連接,訪問服務器多個web資源,而後關閉瀏覽器,整個過程稱之爲一個會話其中無論瀏覽器發送多少請求,都視爲一次會話,直到瀏覽器關閉,本次會話結束。
其中注意,一個瀏覽器就至關於一部電話,若是使用火狐瀏覽器,訪問服務器,就是一次會話了,而後打開google瀏覽器,訪問服務器,這是另外一個會話,雖然是在同一臺電腦,同一個用戶在訪問,可是,這是兩次不一樣的會話。java

1.二、會話機制

  Web程序中經常使用的技術,用來跟蹤用戶的整個會話。經常使用的會話跟蹤技術是Cookie與Session。Cookie經過在客戶端記錄信息肯定用戶身份,Session經過在服務器端記錄信息肯定用戶身份。web

2、Cookie

Cookie是客戶端技術,程序把每一個用戶的數據以cookie的形式寫給用戶各自的瀏覽器。當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶着各自的數據去。這樣,web資源處理的就是用戶各自的數據了。因爲cookie是由客戶端瀏覽器保存和攜帶的,因此稱之爲客戶端技術apache

2.一、Cookie的工做流程

1)servlet建立cookie,保存少許數據,發送瀏覽器。
2)瀏覽器得到服務器發送的cookie數據,將自動的保存到瀏覽器端。
3)下次訪問時,瀏覽器將自動攜帶cookie數據發送給服務器。api

2.二、Cookie特色

1)每個cookie文件大小:4kb , 若是超過4kb瀏覽器不識別
2)一個web站點(web項目):發送20個
3)一個瀏覽器保存總大小:300個
4)cookie 不安全,可能泄露用戶信息。瀏覽器支持禁用cookie操做。
5) 默認狀況生命週期:與瀏覽器會話同樣,當瀏覽器關閉時cookie銷燬的。---臨時cookie跨域

cookie.setMaxAge(expiry);  //設置cookie被瀏覽器保存的時間。
      
expiry:單位秒,默認爲-1,
expiry=-1:表明瀏覽器關閉後,也就是會話結束後,cookie就失效了,也就沒有了。
expiry>0:表明瀏覽器關閉後,cookie不會失效,仍然存在。而且會將cookie保存到硬盤中,直到設置時間過時纔會被瀏覽器自動刪除,
expiry=0:刪除cookie。不論是以前的expiry=-1仍是expiry>0,當設置expiry=0時,cookie都會被瀏覽器給刪除。
複製代碼

2.三、Cookie操做

操做cookie瀏覽器

  1)建立cookie:new Cookie(name,value)
  2)發送cookie到瀏覽器:HttpServletResponse.addCookie(Cookie)
  3)servlet接收cookie:HttpServletRequest.getCookies() 瀏覽器發送的全部cookie
複製代碼

cookie APItomcat

getName() 得到名稱,cookie中的key
    getValue() 得到值,cookie中的value
  setValue(java.lang.String newValue)  設置內容,用於修改key對應的value值。
  setMaxAge(int expiry) 設置有效時間【】
  setPath(java.lang.String uri)  設置路徑【】  
  setDomain(java.lang.String pattern) 設置域名 , 通常無效,有瀏覽器自動設置,setDomain(".zyh.com")
    www.zyh.com / bbs.zyh.com 均可以訪問
    a.b.zyh.com沒法訪問
    做用:設置cookie的做用範圍,域名+路徑在一塊兒就構成了cookie的做用範圍,上面單獨設置的setPath有用,是由於有瀏覽器自動設置該域名屬性,可是咱們必須知道有這麼個屬性進行域名設置的
  isHttpOnly()  是否只是http協議使用。只能servlet的經過getCookies()得到,javascript不能得到。
  setComment(java.lang.String purpose) (瞭解)  //對該cookie進行描述的信息(說明做用),瀏覽器顯示cookie信息時能看到
  setSecure(boolean flag) (瞭解)  是否使用安全傳輸協議。爲true時,只有當是https請求鏈接時cookie纔會發送給服務器端,而http時不會,可是服務端仍是能夠發送給瀏覽端的。
  setVersion(int v) (瞭解)  參數爲0(傳統Netscape cookie規範編譯)或1(RFC 2109規範編譯)。這個沒用到,不是很懂
複製代碼

注意事項
cookie不能發送中文,若是要發送中文,就須要進行特別處理。安全

Cookie cookie = new Cookie("country", URLEncoder.encode("中國", "UTF-8"));
response.addCookie(cookie);

//通過URLEncoding就要URLDecoding
String value = URLDecoder.decode(cookies[i].getValue(), "UTF-8");
複製代碼

3、Session

在WEB開發中,服務器能夠爲每一個用戶瀏覽器建立一個會話對象(session對象),注意:一個瀏覽器獨佔一個session對象(默認狀況下)
所以,在須要保存用戶數據時,服務器程序能夠把用戶數據寫到用戶瀏覽器獨佔的session中,當用戶使用瀏覽器訪問其它程序時,其它程序能夠從用戶的session中取出該用戶的數據,爲用戶服務。bash

3.一、Session的原理

  1. 首先瀏覽器請求服務器訪問web站點時,程序須要爲客戶端的請求建立一個session的時候,服務器首先會檢查這個客戶端請求是否已經包含了一個session標識、稱爲SESSIONID
  2. 若是已經包含了一個sessionid則說明之前已經爲此客戶端建立過session,服務器就按照sessionid把這個session檢索出來使用,若是客戶端請求不包含session id,則服務器爲此客戶端建立一個session而且生成一個與此session相關聯的session id,sessionid 的值應該是一個既不會重複,又不容易被找到規律以仿造的字符串,這個sessionid將在本次響應中返回到客戶端保存,保存這個sessionid的方式通常就是cookie。
  3. 這樣在交互的過程當中,瀏覽器能夠自動的按照規則把這個標識發回給服務器,服務器根據這個sessionid就能夠找獲得對應的session,又回到了步驟1。

3.二、Session的生命週期

經常聽到這樣一種誤解「只要關閉瀏覽器,session就消失了」。其實能夠想象一下會員卡的例子,除非顧客主動對店家提出銷卡,不然店家絕對不會輕易刪除顧客的資料。對session來講也是同樣的,除非程序通知服務器刪除一個session,不然服務器會一直保留,程序通常都是在用戶作log off的時候發個指令去刪除session。然而瀏覽器歷來不會主動在關閉以前通知服務器它將要關閉,所以服務器根本不會有機會知道瀏覽器已經關閉,之因此會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器後這個session id就消失了,再次鏈接服務器時也就沒法找到原來的session。若是服務器設置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id發送給服務器,則再次打開瀏覽器仍然可以找到原來的session。

偏偏是因爲關閉瀏覽器不會致使session被刪除,迫使服務器爲seesion設置了一個失效時間,通常是30分鐘,當距離客戶端上一次使用session的時間超過這個失效時間時,服務器就能夠認爲客戶端已經中止了活動,纔會把session刪除以節省存儲空間。Session生成後,只要用戶繼續訪問,服務器就會更新Session的最後訪問時間,不管是否對Session進行讀寫,服務器都會認爲Session活躍了一次,從新開始計算失效時間。

咱們也能夠本身來控制session的有效時間:

session.invalidate()將session對象銷燬
setMaxInactiveInterval(int interval) 設置有效時間,單位秒
複製代碼

在web.xml中配置session的有效時間: 

<session-config>
<session-timeout>30</session-timeout> 單位:分鐘 
<session-config>
複製代碼

因此,討論了這麼久,session的生命週期就是:
建立:Session存儲在服務器端,通常放置在服務器的內存中(爲了高速存取),Sessinon在用戶訪問第一次訪問服務器時建立,須要注意只有訪問JSP、Servlet等程序時纔會建立Session,只訪問HTML、IMAGE等靜態資源並不會建立Session,可調用request.getSession(true)強制生成Session。
銷燬
1)超時,默認30分鐘
2)執行api:session.invalidate()將session對象銷燬、setMaxInactiveInterval(int interval) 設置有效時間,單位:秒
3)服務器非正常關閉(自殺,直接將JVM立刻關閉)
若是正常關閉,session就會被持久化(寫入到文件中,由於session默認的超時時間爲30分鐘,正常關閉後,就會將session持久化,等30分鐘後,就會被刪除)
位置: D:\java\tomcat\apache-tomcat-7.0.53\work\Catalina\localhost\test01\SESSIONS.ser

3.三、session id的URL重寫

當瀏覽器將cookie禁用,基於cookie的session將不能正常工做,每次使用request.getSession() 都將建立一個新的session。達不到session共享數據的目的,可是咱們知道原理,只須要將session id 傳遞給服務器session就能夠正常工做的。
解決:經過URL將session id 傳遞給服務器:URL重寫
1)手動方式: url;jsessionid=....
2)api方式:

encodeURL(java.lang.String url) 進行全部URL重寫
encodeRedirectURL(java.lang.String url) 進行重定向 URL重寫
複製代碼

這兩個用法基本一致,只不過考慮特殊狀況,要訪問的連接可能會被Redirect到其餘servlet去進行處理,這樣你用上述方法帶來的session的id信息不能被同時傳送到其餘servlet。這時候用encodeRedirectURL()方法就能夠了。若是瀏覽器禁用cooke,api將自動追加session id ,若是沒有禁用,api將不進行任何修改。
注意:若是瀏覽器禁用cookie,web項目的全部url都需進行重寫。不然session將不能正常工做。
當cookie禁用時:

image.png

4、Session和Cookie的區別

4.一、從存儲方式上比較

Cookie只能存儲字符串,若是要存儲非ASCII字符串還要對其編碼。
Session能夠存儲任何類型的數據,能夠把Session當作是一個容器

4.二、從隱私安全上比較

Cookie存儲在瀏覽器中,對客戶端是可見的。信息容易泄露出去。若是使用Cookie,最好將Cookie加密
Session存儲在服務器上,對客戶端是透明的。不存在敏感信息泄露問題。

4.三、從有效期上比較

Cookie保存在硬盤中,只須要設置maxAge屬性爲比較大的正整數,即便關閉瀏覽器,Cookie仍是存在的
Session的保存在服務器中,設置maxInactiveInterval屬性值來肯定Session的有效期。而且Session依賴於名爲JSESSIONID的Cookie,該Cookie默認的maxAge屬性爲-1。若是關閉了瀏覽器,該Session雖然沒有從服務器中消亡,但也就失效了。

4.四、從對服務器的負擔比較

Session是保存在服務器的,每一個用戶都會產生一個Session,若是是併發訪問的用戶很是多,是不能使用Session的,Session會消耗大量的內存。
Cookie是保存在客戶端的。不佔用服務器的資源。像baidu、Sina這樣的大型網站,通常都是使用Cookie來進行會話跟蹤。

4.五、從瀏覽器的支持上比較

若是瀏覽器禁用了Cookie,那麼Cookie是無用的了!
若是瀏覽器禁用了Cookie,Session能夠經過URL地址重寫來進行會話跟蹤。

4.六、從跨域名上比較

Cookie能夠設置domain屬性來實現跨域名 Session只在當前的域名內有效,不可誇域名

相關文章
相關標籤/搜索