解決方案:web
1.在URL地址欄拼接參數,可是不安全(`www.xxx.do?userId=1`)
2.使用Cookie
3.使用Session
複製代碼
Cookie是客戶端技術,全部的瀏覽器都支持Cookie緩存,Cookie數據存放的位置位於客戶端的內存中,也能夠調整Cookie存放與磁盤中。跨域
步驟:瀏覽器
1.用戶請求一個支持Cookie的後臺服務器緩存
2.服務器作請求處理,返回相應信息,並設置Cookie緩存用戶信息。在能夠在開發者模式相應頭中看到Set-Cookie
看到Cookie中的數據,在後續的請求都會自動發送Cookie到服務器,直到Cookie銷燬或過時。tomcat
3.客戶端再次請求,在請求頭中攜帶Cookie。安全
4.服務器接收到請求數據,並解析Cookie內容,作出請求相應。服務器
Cookie分爲會話Cookie和持久化Cookie。會話Cookie存放與客戶端的內存中,瀏覽器關閉後Cookie自動銷燬;持久化Cookie存放於磁盤中,瀏覽器關閉後不會銷燬Cookie。能夠經過cookie.setMaxAge(value);
來設置Cookie的存活時間。cookie.setMaxAge(0);
表示刪除Cookie,cookie.setMaxAge(value<0);
表示會話Cookie;cookie.setMaxAge(value>0);
指定描述,能夠用於設置持久化Cookie。cookie
設置Cookie的做用域session
Cookie中的字段中有兩個能夠設置Cookie的做用域。Path
設置Cookie的有效URL路徑,Domain
指定Cookie的有效域。網站
cookie.setPath("/");
表示Cookie的做用域爲整個應用,cookie.setPath("/**");
表示Cookie的做用域爲**
的做用範圍,路徑爲**
都能訪問到Cookie,cookie.setPath("/view/a");
表示路徑爲view/a
的路徑下都能訪問Cookie,而view/b
不能訪問到Cookie。
cookie.setDomain("value");
默認爲web應用域名或者Ip地址。若是須要設置跨域訪問:photo.google.com
和mail.google.com
實現cookie共享須要設置cookie.setDomain(".google.com");
Cookie的缺陷:
1.Cookie數據保留在請求頭中,不安全。
2.Cookie數據存儲中文須要轉碼,瀏覽器默認iso8859。
3.Cookie存放的數據爲String類型
4.Cookie數據容量限制爲4KB之內,一臺服務器最多保留20個Cookie,一個客戶端瀏覽器最多保存300個Cookie。
5.共享數據本應該放在服務器上。
Session是服務端技術,利用這個技術,服務器在運行時能夠爲每個用戶的瀏覽器建立一個獨享的Session對象,用於Session爲用戶瀏覽器獨享,因此用戶在訪問服務器時,能夠把各自的數據放在各自的Session中,當用戶再去訪問服務器其餘web資源時,其餘web資源再從服務端的Session中獲取數據。
步驟:
1.用戶請求一個支持Cookie的後臺服務器
2.服務器作出請求處理,建立Session對象,保存用戶的相關信息,並建立Cookie對象,Cookie對象的jsessionid
指向Session存放在服務器的內存地址。服務器經過相應頭Set-Cookie
返回給瀏覽器Cookie的信息(Cookie中包含Session的內存地址,Session會消耗服務器的資源),在後續的請求都會自動發送Cookie到服務器,服務器經過解析Cookie中的jsessionid
來獲取Session中的數據。
3.客戶端再次請求,在請求頭中攜帶Cookie。
4.服務器接收到請求數據,服務器經過解析Cookie中的jsessionid
在內存中來獲取Session中的數據,作出請求相應。
Session超時管理
在瀏覽器與服務器的會話中,若是瀏覽器長時間沒有與服務器進行交互,服務器的Session會自動銷燬(網站登入後長時間沒有交互後須要再次登入),瀏覽器與服務器以前的交互的Session就不存在了,若是須要再次用戶Session的緩存,須要再次請求服務器從新建立新的Session。若是直接關閉瀏覽器,Session也會自動銷燬,由於Session的應用地址時保存在Cookie中的,Cookie中數據是保存在瀏覽器的內存中的,瀏覽器關閉後Cookie銷燬,沒法識別Session的內存地址,超時後Session會自動銷燬。
設置Session失效時間的三種方式:
1.在項目中的web.xml中設置,時間表示分鐘
<session-config>
<session-timeout>2</session-timeout>
</session-config>
2.在tomcat的web.xml中設置,默認時30分鐘
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3.在Servlet中設置
HttpSession session = request.getSession();
session.setMaxInactiveInterval(60);//單位爲秒
-----------------
優先級是就近原則:Servlet>項目中的web.xml>Tomcat中的web.xml
複製代碼
URL重寫
Session依託Cookie來記錄Session在服務器的內存地址,可是瀏覽器能夠設置禁用Cookie,這樣瀏覽器請求數據的時候沒法攜帶jsessionid
致使Session在服務器中失效。可是咱們能夠在地址欄手動拼接jsessionid
,如localhost:8080/demo;jessionid=***
,這樣作很麻煩,Sun公司提供了兩個方法用於在瀏覽器地址欄拼接jessionid
。
response.encodeUrl(url);
和response.encodeRedirectUrl(ulr);
。方法會先判斷瀏覽器是否禁用了cookie,若是禁用了cookie會在url後拼接上jessionid
,若是瀏覽器沒有禁用cookie,Session會經過請求頭Cookie的jessionid
來傳遞。