HttpSession
為什么80%的碼農都做不了架構師?>>> ??
HttpSession(*****)
1、HttpSession概述
? ? * HttpSession是由JavaWeb提供的,用來會話跟蹤的類。session是服務器端對象,保存在服務器端!!!
? ? * HttpSession是Servlet三大域對象之一(request、session、application(ServletContext)),
? ? ? ? 所以它也有setAttribute()、getAttribute()、removeAttribute()方法。(JSP中有四個域對象)
? ? * HttpSession底層依賴Cookie,或是URL重寫!
2、HttpSession的作用
? ? * 會話范圍:會話范圍是某個用戶從首次訪問服務器開始,到該用戶關閉瀏覽器結束!
? ? ? ? > 會話:一個用戶對服務器的多次連貫性請求!所謂連貫性請求,就是該用戶多次請求中間沒有關閉瀏覽器!
? ? * 服務器會為每個客戶端創建一個session對象,session就好比客戶在服務器端的賬戶,它們被服務器保存到一個Map中,
? ? 這個Map被稱之為session緩存!
? ? ? ? > Servlet中得到session對象:HttpSession session = request.getSession();
? ? ? ? > Jsp中得到session對象:session是jsp內置對象之下,不用創建就可以直接使用!
? ? * session域相關方法:
? ? ? ? > void setAttribute(String name, Object value);
? ? ? ? > Object getAttribute(String name);
? ? ? ? > void removeAttribute(String name);
3、案例1:演示session中會話的多次請求中共享數據
? ? * AServlet:向session域中保存數據
? ? * BServlet:從session域中獲取數據
? ? * 演示:
? ? ? ? > 第一個請求:訪問AServlet
? ? ? ? > 第二個請求:訪問BServlet
4、案例2:演示保存用戶登錄信息(精通)
? ? * 案例相關頁面和Servlet:
? ? ? ? > login.jsp:登錄頁面
? ? ? ? > succ1.jsp:只有登錄成功才能訪問的頁面
? ? ? ? > succ2.jsp:只有登錄成功才能訪問的頁面
? ? ? ? > LoginServlet:校驗用戶是否登錄成功!
? ? * 各頁面和Servlet內容:
? ? ? ? > login.jsp:提供登錄表單,提交表單請求LoginServlet
? ? ? ? > LoginServlet:獲取請求參數,校驗用戶是否登錄成功
? ? ? ? ? ? <> 失敗:保存錯誤信息到request域,轉發到login.jsp(login.jsp顯示request域中的錯誤信息)
? ? ? ? ? ? <> 成功:保存用戶信息到session域中,重定向到succ1.jsp頁面,顯示session域中的用戶信息
? ? ? ? > succ1.jsp:從session域獲取用戶信息,如果不存在,顯示“您還沒有登錄”。存在則顯示用戶信息
? ? ? ? > succ2.jsp:從session域獲取用戶信息,如果不存在,顯示“您還沒有登錄”。存在則顯示用戶信息
? ? 只要用戶沒有關閉瀏覽器,session就一直存在,那么保存在session中的用戶信息也就一起存在!那么用戶訪問succ1
? ? 和succ2就會通過!
5、HttpSession原理(理解)
? ? * request.getSession()方法:
? ? ? ? > 獲取Cookie中的JSESSIONID:
? ? ? ? ? ? (1)如果sessionId不存在,創建session,把session保存起來,把新創建的sessionId保存到Cookie中。
? ? ? ? ? ? (2)如果sessionId存在,通過sessionId查找session對象,
? ? ? ? ? ? ? ? ? ? 如果找到了,那么就不會再創建session對象了;
? ? ? ? ? ? ? ? ? ? 如果沒有查找到,說明過期了,服務器創建新session并保存起來,把新創建的sessionId保存到Cookie中。
? ? ? ? ? ? (3)返回session
? ? 如果創建了新的session,瀏覽器會得到一個包含了sessionId的Cookie,這個Cookie的生命為-1,即只在瀏覽器內存中存在,
? ? 如果不關閉瀏覽器,那么Cookie就一直存在。
? ? 下次請求時,再次執行request.getSession()方法時,因為可以通過Cookie中的sessionId找到session對象,
? ? 所以與上一次請求使用的是同一session對象。
? ? * 服務器不會馬上給你創建session,在第一次獲取session時,才會創建!request.getSession();
? ? * request.getSession(false)、request.getSession(true)、request.getSession(),后兩個方法效果相同,
? ? ? ? > 第一個方法:如果session緩存中(如果cookie不存在),不存在session,那么返回null,而不會創建session對象。
6、HttpSession其他方法:
? ? * String getId():獲取sessionId;
? ? * int getMaxInactiveInterval():獲取session可以的最大不活動時間(秒),默認為30分鐘。
? ? ? ? ? ? 當session在30分鐘內沒有使用,那么Tomcat會在session池中移除這個session;
? ? * void invalidate():讓session失效!調用這個方法會被session失效,當session失效后,客戶端再次請求,
? ? ? ? ? ? 服務器會給客戶端創建一個新的session,并在響應中給客戶端新session的sessionId;
? ? * boolean isNew():查看session是否為新。當客戶端第一次請求時,服務器為客戶端創建session,
? ? ? ? ? ? 但這時服務器還沒有響應客戶端,也就是還沒有把sessionId響應給客戶端時,這時session的狀態為新。
7、web.xml中配置session的最大不活動時間
? ? <session-config>
? ? ? ? <session-timeout>30</session-timeout>
? ? </session-config>
8、URL重寫(理解)
? ? ? ? 就是把所有的頁面中的路徑,都使用response.encodeURL("..")處理一下!
? ? * session依賴Cookie,目的是讓客戶端發出請求時歸還sessionId,這樣才能找到對應的session
? ? * 如果客戶端禁用了Cookie,那么就無法得到sessionId,那么session也就無用了!
? ? * 也可以使用URL重寫來替代Cookie
? ? ? ? > 讓網站的所有超鏈接、表單中都添加一個特殊的請求參數,即sessionId
? ? ? ? > 這樣服務器可以通過獲取請求參數得到sessionId,從而找到session對象。
? ? * response.encodeURL(String url)
? ? ? ? > 該方法會對url進行智能的重寫:當請求中沒有歸還sessionid這個cookie,那么該方法會重寫url,否則不重寫!
? ? ? ? ? ? 當然url必須是指向本站的url。
---------------------?
轉載于:https://my.oschina.net/oszzq/blog/3024018
總結
以上是生活随笔為你收集整理的HttpSession的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【PM】当大厂来临时,求生?求胜?
- 下一篇: 07-01-安装-Exchange Se