基於Http的無狀態問題,咱們在瀏覽網頁並登錄某一個網點進行一次會話操做時,瀏覽器並不能知道是哪一個客戶端訪問請求,傳統的解決方法是在地址欄中添加url參數向下一個頁面傳送用戶信息,可是這樣多個參數傳遞比較麻煩,並且經過get方式傳遞url請求參數並不安全,容易被抓包形成信息安全問題。而對應這種問題,咱們通常採用Cookie和Session來更好地解決Http網絡傳輸用戶信息無狀態的問題。git
傳統方式傳遞url參數示例代碼以上傳GitHub地址,這裏就不過多解釋:github
https://github.com/devyf/JavaWorkSpace/tree/master/Cookie_Session_0201web
Cookie是一個保存在客戶端的簡單的文本文件,它保存了該客戶訪問這個Web文檔時的信息,至關於一個憑證。跨域
瀏覽器第一次訪問Web服務器時,會把自身的參數信息傳遞給服務器,服務器這時會建立一個Cookie用來保存瀏覽器發送過來的客戶參數信息,封裝在Cookie裏面,並將封裝好該瀏覽器客戶信息的Cookie返回給瀏覽器,表示服務器已經確認收到你的請求了,瀏覽器確認收到服務器給到的帶有本地參數信息的Cookie以後,在下一次發送訪問請求時,只須要傳送以前對應的Cookie便可。Cookie內部儲存值也是以key,value鍵值對的形式存儲。瀏覽器
對於Cookie在瀏覽器的保存用戶信息以下,Set-Cookie在保存對應的瀏覽器信息,第二次訪問的時候能夠看到請求中已經包含了Cookie信息,Cookie中保存了客戶端用戶名信息。安全
① 建立一個Cookie,並設置name,value來保存信息,同時返回給response對象,在下一個頁面無需傳遞url參數信息;服務器
② 在展現頁面(下一個須要獲取參數頁面)經過請求request對象拿到Cookies序列,找到對應的cookie,取出value;cookie
在實際項目過程當中使用Cookie來存儲中文url參數可能會遇到亂碼問題,這時須要咱們先對Cookie存儲的中文字符進行編碼,取用的時候再以相同的編碼進行解碼;網絡
Tomcat7中不支持中文,Tomcat8已經能夠支持,不用再編碼、解碼:session
編碼:
解碼:
修改Cookie中存儲的值有兩種方式:
第一種方式:
拿到原來的Cookie,設置它的value,使用cookie.setValue(「stringValue」);
第二種方式:
建立一個新的Cookie,使用修改鍵值對的形式,給原來相同的name的value賦值新的newValue值,
Cookie從建立Cookie對象時就在瀏覽器的請求頭中產生,直到關閉瀏覽器頁面後消失,同時咱們也能夠本身去設置Cookie的存在時間。
方法:cookie.setMaxAge(int second);
例如:cookie.setMaxAge(60 * 60 * 24 * 7); //一週
其中正數表明多少秒,爲0表明刪除該Cookie,負數表明關閉瀏覽器。
/cookie/email 在這個路徑下保存的cookie;
/cookie2/list 這個路徑不能拿到上層的cookie信息;
/cookie/show 這個路徑能夠拿到上層(/cookie/email)的cookie信息
cookie默認只存在當前路徑的位置中
解決上述問題能夠在/cookie/email的Servlet中設置Cookie的Path路徑爲/,表示路徑能夠爲任何路徑都可以訪問:
如在ListServlet中改變了它的請求url地址,則在對應的/cookie2/list中不能獲取cookie中保存的用戶參數信息,而其它頁面不受影響:
頁面參數獲取以下:
在設置了cookie的Path爲」/」以後,對應參數信息就能夠獲取了:
就咱們使用百度的時候(登陸一次,在全部的地方均可以使用):
news.baidu.com
doc.baidu.com
Music.baidu.com
跨域對二級域名跨域的方式
實現代碼:cookie.setDomain(".baidu.com")
優勢:
Cookie解決了Web瀏覽器之間無狀態(客戶端數據不能共享)的問題,能夠自由設置保存的時長;
缺點:
存在於客戶端瀏覽器,F12能夠查看用戶信息,不安全;
Cookie大小有限制,限制在4KB之內;
一臺服務器在一個客戶端最多能保存20個Cookie;
一個瀏覽器最多能夠保存300個Cookie;
Cookie不能操做對象;
定義:
在計算機中,尤爲是在網絡應用中,Session稱爲「會話控制」。Session對象存儲特定用戶會話所需的屬性及配置信息。當用戶在應用程序的Web頁之間跳轉時,存儲在Session對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。
瀏覽器在第一次向服務器發送請求時會攜帶用戶名和密碼等參數信息傳送給服務器端,這時服務器會返回一個jsessionId(保存在Cookie中)給瀏覽器,下一次瀏覽器再次訪問服務器的時候,就可使用這個jsessionId去服務器端拿到對應的session中的數據。若是找到對應的session就取這個session中的Object對象,沒有就建立一個session。
理解Session:
① Session是把數據保存到服務器端;
② Session的底層依然是使用Cookie,創建在Cookie存儲的基礎上來存用戶信息
① 從前臺request請求對象中獲取HttpSession對象,用來存儲用戶信息;
HttpSession session = req.getSession();
若是有session,那麼直接拿到session
若是沒有session,建立一個session,再拿到這個session
HttpSession session = req.getSession(boolean value);
value:true -> 若是有直接拿,若是沒有建立一個
value:false ->若是有直接拿,若是沒有返回null
② 下層頁面Servelet獲取前面建立的Session以後,從以前的Session獲取以前傳入的對應key取出的Object值;
使用session.removeAttribute(String name)能夠刪除存儲在Session對象中的數據,根據對應的key刪除Session中的一條記錄,對應前一個Servlet頁面刪除,後一個頁面就不能取出對應的值了,返回null;
對應頁面:
除此以外,還可使用session.invalidate()方法銷燬整個Session對象;
存入對象:
取出對象:
展現效果:
Session從建立Session對象時就在瀏覽器中產生,直到關閉瀏覽器頁面後消失。
Session有超時時間,默認爲30分鐘,從咱們沒有操做頁面開始計算,30分鐘後Session中存儲的對象會失效。
設置Session的超時失效時間:
① 自定義Session的超時時間,可使用session.setMaxInactiveInterval(Integer interval)方法;
② 咱們通常比較經常使用的方式會在web.xml中進行配置Session的過時時間(單位分鐘);
注意:若是設置爲負數,會直接關閉瀏覽器;
重寫URL
http://localhost/session/single;jsessionid=372EC71FF0939E7C74B533B071714C5E
resp.encodeURL("路徑") -->資源重寫解決這個問題
工做中咱們有可能會作上傳的功能。上傳的時候頗有可能咱們會使用flash組件。
Flash組件有一個問題:session丟失,這個時候就須要將jsessionid手動進行傳遞提交
注意:
① 不少網站/系統登錄就是使用session;
② Session有一個問題:因此內容都保存服務器內存裏面,服務器內存有很大負擔,慎用。
優勢:
Session把信息存儲在服務器中,經過Cookie向瀏覽器請求頭信息中暴露一個jSessionId,底層經過Cookie來存儲jSessionId;
由於沒有暴露用戶信息,相對Cookie安全性更高;
Session能夠存儲Object對象,通常用於存儲用戶登錄信息;
缺點:
Session是存儲在服務器中,若是過多存入Session對象,會形成服務器內存壓力過大;
在某些禁用Cookie的場景使用較爲麻煩。