會話技術------伺服器技術session
阿新 • • 發佈:2020-09-20
概述:
客戶端會話技術cookie是儲存在客戶端瀏覽器的,那麼與之相對的伺服器端會話技術session是儲存在伺服器端的。
會話技術旨在資料的共享,下面一段session的程式碼演示:
@WebServlet("/servletSession01") public class ServletSession01 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//獲取session物件 HttpSession session = request.getSession(); session.setAttribute("name","zhangsan"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
資源類2:
@WebServlet("/servletSession02")public class ServletSession02 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession();//獲取session String name = (String) session.getAttribute("name"); System.out.println(name); }protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
圖解session物件建立的傳遞過程:
伺服器如何確保在一次會話範圍內多次獲取的session物件是同一個?
session在客戶端和瀏覽器之間的傳遞是依賴於cookie的
-
在呼叫request方法的getsession();方法時:
- 如果是本次會話第一次呼叫此方法
- 那麼伺服器就會在記憶體中建立一個新的session物件
- 並且會給這個記憶體的session物件分配id值(如上圖的742938a4289)
- 在伺服器響應瀏覽器是會在響應頭中有set-cookie:JSESSIONID=742938a4289 (JSESSIONID是一個特殊的響應頭標記它代表的就是session依賴)
- 瀏覽器再次訪問會在請求頭中含有cookie:JSESSIONID=742938a4289
- 當本次會話再次請求獲得session物件是,會根據JSESSIONID尋找session物件記憶體地址
- 如果不是本次會話中第一次
- 重複第一次會話的最後兩個步驟
- 如果是本次會話第一次呼叫此方法
通過瀏覽器開發者模式驗證上面的說法:
第一次請求資源類1的響應頭:
第一次請求資源類2請求頭:
可以看出兩幅圖的JSESSIONID是相同的
判斷以下三種情況獲得的session物件是不是同一個物件:
- 客戶端關閉伺服器不關閉:
- 不是同一個物件,因為session物件在客戶端和瀏覽器之間的會話是依賴於cookie物件的,如果關閉瀏覽器雖然session物件並不會被銷燬,但是它所依賴的cookie物件在瀏覽器端會被銷燬(預設情況下),多以再次訪問伺服器並不會含有上一次建立session物件的JSESSIONID的請求頭,所以伺服器會建立一個新的session物件
- 希望瀏覽器關閉後還可以訪問到同一個session的解決辦法:
- 設定一個cookie物件鍵為:JSESSIONID,值是session的記憶體id(通過session.getId();方法獲得),然後設定它的存活時間,就是可以找到相同session的時間間隔
程式碼如下:
@WebServlet("/servletSession02") public class ServletSession02 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession();//獲取session String name = (String) session.getAttribute("name"); Cookie cookie=new Cookie("JSESSIONID",session.getId());//手動設定依賴cookie cookie.setMaxAge(60*5);//設定依賴cookie的存活時間為5分鐘 response.addCookie(cookie); System.out.println(name); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
2.客戶端不關閉伺服器關閉:
在idea中訪問的並不是同一個,但是在實際開發中這樣訪問的其實會是同一個session物件,原因是:
- 如果是正常關閉伺服器,那麼在伺服器關閉之前會將記憶體中的session物件序列化(鈍化)到硬碟中
- 然後再次啟動伺服器的時候就會將上次關閉時序列化的session物件重新活化到記憶體中
Session物件的失效時間:
- 伺服器關閉
- session物件的自殺方法:invalidate();
- session的預設失效時間是30分鐘(在Tomcat的主配置檔案web.xml中配置標籤
<session-config>
)
<session-timeout>30</session-timeout>
</session-config>
session的特點:
- session用於儲存一次會話的多次請求的多次請求的資料,儲存在伺服器。
- session可以儲存任意型別(指的是值,鍵只能String,cookie鍵值只能是String),任意大小的資料