會話(Session)跟蹤是Web程序中經常使用的技術,用來跟蹤用戶的整個會話。經常使用的會話跟蹤技術是 Cookie 和 Session。
1、Cookie
Cookie 經過在客戶端記錄信息肯定用戶的身份,Session經過在服務器端記錄信息肯定用戶身份
一、Cookie簡介:
- Cookie 意爲「甜餅」,有 W3C組織提出。
- Cookie的出現:因爲HTTP協議是一種無狀態的協議,服務器單從網絡鏈接上無從知道客戶身份,爲了解決此問題,因而出現了Cookie
- Cookie其實是一小段的文本信息,客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用 response 向客戶端瀏覽器頒發一個 Cookie,客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同Cookie一同提交給服務器,服務器會檢查該Cookie,以此來辨認用戶的狀態。服務器還能夠根據須要修改Cookie的內容
二、Cookie的有效期:
- Cookie的 maxAge 決定着 Cookie的有效期,單位爲:秒/s(Second)
- Cookie中經過 getMaxAge() 方法和 setMaxAge(int maxAge) 方法來讀寫 maxAge屬性
- 若是 maxAge 屬性爲正數,則表示該 Cookie會在 maxAge 秒以後自動失效。瀏覽器會將 maxAge 爲正數的 Cookie持久化,即 寫到對應的Cookie文件中。不管客戶關閉了瀏覽器仍是電腦,只要在 maxAge 秒以前,登陸網站時該 Cookie仍然有效
- 若是 maxAge 爲負數,則表示該 Cookie僅在本瀏覽器窗口以及本窗口打開的子窗口內有效,關閉窗口後該 Cookie當即失效。 maxAge 爲負數的 Cookie,爲臨時性 Cookie,不會被持久化,也不會被寫到 Cookie文件中。 Cookie 信息保存在瀏覽器內存中,所以關閉瀏覽器該 Cookie就消失了。 Cookie 默認的 maxAge 值 爲 -1
- 若是 maxAge 爲 0,則表示刪除該 Cookie。 Cookie機制沒有提供刪除 Cookie的方法,所以經過設置該 Cookie即時失效實現刪除 Cookie的效果。 失效的Cookie會被瀏覽器從 Cookie文件或者 內存中刪除
//新建 Cookie對象Cookie cookie = new Cookie("userName","hello");//設置生命週期爲 0, 不能爲 負數cookie.setMaxAge(0);//必須執行下面這一句代碼response.addCookie(cookie);
- response 對象提供的 Cookie 操做方法只有一個添加操做 addCookie(Cookie cookie) 。想要修改 Cookie 只能使用一個同名的 Cookie來覆蓋原來的Cookie,達到修改的目的。刪除時是須要把 maxAge 修改成 0 便可
三、Cookie 的修改、刪除:
- Cookie 並不提供修改、刪除操做,若是須要新建一個 同名的 Cookie,只須要新建一個同名的Cookie,並添加到 response 中覆蓋原來的Cookie
- 若是想要刪除某個Cookie,只須要新建一個同名的Cookie,並將maxAge設置爲0,並添加到response中覆蓋原來的Cookie。注意:是 0 而不是 負數。負數表明其餘意義
- 注意:修改、刪除Cookie時,新建的Cookie出value和maxAge以外的全部屬性(name、path、domain等)都要與原Cookie徹底同樣,不然,瀏覽器會將其視爲兩個不一樣的Cookie,不會覆蓋,致使修改或刪除失敗!
2、Session
一、Session簡介:
- Session是另外一種記錄客戶狀態的機制,不一樣的是 Cookie保存在瀏覽器中,二Session保存在服務器上。
- 客戶端瀏覽器訪問服務器的時候,服務器吧客戶端信息以某種形式記錄在服務器上,這就是Session,客戶端瀏覽器再次訪問時只須要從該Session中查找客戶的狀態就能夠了
- 若是說 Cookie 機制是經過檢查客戶身上的「通行證」來肯定客戶的身份的話,那麼 Session機制就是經過檢查服務器上的「客戶明細表」來確認客戶身份。
- Session至關於程序在服務器上創建一份客戶檔案,客戶來訪時只須要查詢客戶檔案表就能夠了
- Session對應的類爲 javax.servlet.http.HttpSession類,每個來訪者對應一個Session對象,全部該客戶的狀態信息都保存在這個Session對象裏。Session對象是在客戶端第一次請求服務器的時候建立的。
- Session是一種 key-value 的屬性對。能夠經過 getAttribute(String key) 和 setAttribute(String key, Object value) 方法來讀寫客戶狀態信息。在Servlet中使用request.getSession() 方法來獲取該客戶的Session。
//獲取Session對象HttpSession session = request.getSession();//設置Session中的屬性session.setAttribute("loginTime", new Date());//獲取session屬性out.println("登陸時間爲:" + (Date)session.getAttribute("loginTime"));
- request 還可使用 getSession(boolean create) 來獲取session。
- 當 create 爲 true 時,當客戶端的Session不存在,則會先建立Session對象而後再將其返回
二、Session的生命週期:
- Session經過調用 invalidate() 方法來使Session對象失效
- HttpSession的經常使用方法:
- void setAttribute(String key, Object value):設置Session屬性
- String getAttribute(String key):返回Session屬性
- Enumeration getAttributeNames():返回Session中存在的屬性名
- void removeAttribute(String key): 移除Session屬性
- String getId():返回Session的 ID,該ID由服務器自動建立,不會重複
- long getCreationTime(): 返回Session的建立日期,返回類型爲long,常被轉換爲Date類型。 eg: Date createTime = new Date(session.getCreationTime())
- long getLastAccessedTime(): 返回Session的最後活躍時間,返回類型爲long
- int getMaxInactiveInterval():返回Session的超時時間,單位爲:秒;超過該時間沒有訪問,服務器會認爲該Session失效
- void setMaxInactiveInterval(int second): 設置Session的超時時間,單位爲:秒
- boolean isNew():返回該Session是不是新建立的
- void invalidate():使該 Session 失效
- 小提示:Tomcat中Session的默認失效時間爲 20 分鐘,可經過 setMaxInactiveInterval(int seconds) 修改超時時間。能夠修改 web.xml 改變Session的默認超時時間:
<session-config> <!-- 此處的單位爲:分鐘 --> <session-timeout>60</session-timeout></session-config>
三、URL地址重寫
- 當客戶端瀏覽器將 Cookie功能禁用或者不支持Cookie時,Java Web 提供了另外一種解決方案: URL地址重寫
- 原理:將該用戶Session的id信息重寫到URL地址中,服務器可以解析重寫後的URL獲取Session的id。這樣即便客戶端瀏覽器不支持 Cookie,也可使用Session來記錄用戶的狀態
- HttpServletResponse類提供了 encodeURL(String url):實現URL地址重寫
四、Session中禁止使用 Cookie
- 方式一:找到項目中的 META-INF 目錄(與WEB-INF同級,若是沒有則本身新建一 個),新建一個 context.xml 文件(若是有就打開編輯):編輯內容爲:
<?xml version='1.0' encoding='UTF-8' ?><Context path="/項目名稱" cookies="false"> </Context>
- 方式二:修改Tomcat全局的 conf/context.xml 文件:
<Context cookies="false"></Context>
- 注意:該配置只是禁止Session使用Cookie做爲識別標誌,並不能阻止其餘的Cookie讀寫,也就是說服務器不會自動維護名爲 JSESSIONID 的Cookie了,但程序中仍然能夠讀寫其餘的Cookie