Session與Cookie詳解
1. 什麽是會話 會話的目的
https://www.cnblogs.com/teeva/p/4474602.html
1.1會話:客戶端向瀏覽器發送一個連接請求開始,客戶端明確會話結束或者服務器在預設的一段時間內沒有收到連接請求會話結束
1.2會話技術的目的:HTTP是一個無連接的協議,但在會話過程中想要保存在會話過程中生成的一些信息。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
2.session技術的原理及實現
2.1 session原理
當瀏覽器發送第一次發送請求的時候,服務器收到請求會自動生成一個Sesion ID,並開辟一個Session域,並會響應瀏覽器,以Cookie的方式寫入到瀏覽器中。當再次發送請求時,瀏覽器會把這個會把這個Sessio ID 發送給Servlet,Servlet根據Session ID找到相應的Session域,在這個Session域中取出數據。
抓包查看
第一次請求SessionServlet(內容為HttpSession session = request.getSession();)
第二次請求SessionServlet(內容為HttpSession session = request.getSession();)
請求SessonSevlet2(Servlet的內容空白只做測試用,因為是在同路徑下,依然帶有Session)
----------------------------------------------------------------------------------------------------------------------------
2.2Session的實現
建立
HttpSession session = request.getSession();//如果這次請求有對應的Session就返回那個Session,沒有的話就新建一個Session,並將Session發送給客戶端
存儲信息(與其他域對象一樣的三個函數)
session.setAttribute(String name,Object obj);
session.setAttribute(String name,Object obj);
session.setAttribute(String name,Object obj);
Session的生命周期
創建
1.第一次執行request.getSession()時創建
銷毀
1.session過期/失效(默認30分鐘):是從最後一次操作結束時計時
web.xml中的 <session-config> <session-timeout>10</session-timeout> </session-config> 可以設置單前工程的session的持久化時間 也可以在Server.xml修改相關的信息,設置全局的session持久化時間
2.調用session.invadate()
3.服務器關閉時
註意:瀏覽器關閉,session就銷毀,這句話是不正確的
雖然瀏覽器關閉之後,再次與相同的地址建立請求,會新建一個Session,但是並不代表是服務器端的Session被銷毀了。原因是Session ID是以Cookie的形式在瀏覽器中存儲了,Cookie的默認存在時間是一次會話的範圍,瀏覽器一旦關閉Cookie信息就被清除了,所以在發送鏈接請求的時候就不會發送對應的Session ID了。如果想解決上述問題就可以設置Cookie的持久化,代碼如下:
Cookie cookie = new Cookie("JSESSIONID",session.getId()); cookie.setPath("/29-Cookie-Seesion");//設置cookie的路徑範圍,只有在請求相同路徑內的資源時候,才會發送對應的cookie cookie.setMaxAge(60*2); response.addCookie(cookie);
---------------------------------------------------------------------------------------------------------------------------------------------
3.Cookie技術
有了前面session的鋪墊,cookie就比較好理解了
3.1建立cookie
Cookie cookie = new Cookie(String cookieName,String cookieValue);//新建cookie cookie.setMaxAge(int seconds);//設置cookie的持久化時間,如果設置了Cookie的持久化時間,cookie就會被存儲在磁盤裏,註意要寫在add之前 cookie.setPath("/29-Cookie-Seesion");//設置cookie的路徑範圍,只有在請求相同路徑內的資源時候,才會發送對應的cookie response.addCookie(cookie);//會以響應形式發送給瀏覽器
3.2刪除cookie
新建一個同名cookie,將持久化時間設置為0即可
3.3獲取瀏覽器端的 cookie
Cookie[] cookies = request.getCookies(); if(cookies != null) { //取出每一個cookies for (Cookie cookie : cookies) { //判斷名字是否是自己的 String name = cookie.getName(); if(name.equals("lk")) { response.getWriter().write("lk = value"+cookie.getValue()); } }
Session與Cookie詳解