會話:從打開一個浏覽器,訪問某個網站,到關閉這個浏覽器的這個過程稱為一次會話。http協議是狀態的。
客戶端存儲技術:Cookie
服務端存儲技術:Session
Cookie和Session的區別?
1)存儲在Cookie中的用戶的信息 存在客戶端,Session將數據存儲在服務器端,但是需要在客戶端存儲Session的編碼id
2)安全性而言 Cookie相對不安全 Session相對安全
3)性能而言:根據實際的情況
Cookie技術是將數據存儲到客戶端
1)創建Cookie對象
Cookie cookie = new Cookie(name,value);
2)向客戶端寫出cookie
response.addCookie(cookie );
客戶端:客戶端解析http響應,響應頭中有一個cookie,客戶端會自動將cookie的信息存儲到客戶端的緩存中
1)獲得客戶端攜帶的所有的cookie
Cookies[] request.getCookies();
2)獲得具體的某個cookie
遍歷所有的cookie
通過getName()獲得某一個cookie的名字
通過getValue()獲得某一個cookie的值
1)會話級別的cookie和持久級別的cookie
會話級別的cookie:會話結束cookie就清空
持久級別的cookie:會cookie存儲到磁盤上
保存在磁盤上的時間
cookie.setMaxAge(秒);
注意:如果要想刪除磁盤已經存儲的cookie
將同名的cookie的持久化時間設置為0
將要刪除的cookie的路徑設置成與磁盤上存儲的cookie的路徑一致(即兩個cookie的setPath一致)
2)設置cookie的攜帶的路徑
cookie在默認情況下 會在產生的cookie資源的所在的目錄下都攜帶
cookie.setPath(攜帶cookie的路徑);
設置cookie的攜帶路徑時以/開頭,/代表本web服務器
例如:
cookie.setPath(“/”), cookie在訪問web服務器下的所有資源的都攜帶
cookie.setPath(“/home”),在home應用時攜帶cookie
3)設置三方cookie(了解)
cookie.setDomain(域名);
三方cookie具有進攻性
1 response.setContentType("text/html;charset=UTF-8"); 2 //1、創建時間的Cookie 3 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 4 String accessTime = format.format(new Date()); 5 Cookie cookie = new Cookie("accessTime",accessTime); 6 //1.1 設置cookie的持久化的時間----在磁盤上存儲的時間 7 //cookie.setMaxAge(60*10); 8 //1.2 設置cookie的攜帶路徑 /代表web服務器 9 cookie.setPath("/day11_208/abc/accessTime"); 10 //2、將cookie寫給客戶端 11 response.addCookie(cookie); 12 //3、獲取客戶端攜帶的時間的cookie 13 String accessTime_client = null; 14 Cookie[] cookies = request.getCookies(); 15 if(cookies!=null){ 16 for(Cookie coo:cookies){ 17 //取出美喲個cookie對象的名字 18 String cookieName = coo.getName(); 19 if("accessTime".equals(cookieName)){ 20 //取出該cookie的值 21 accessTime_client = cookie.getValue(); 22 } 23 } 24 } 25 26 //4、為用戶顯示上次訪問時間 27 if(accessTime_client!=null){ 28 response.getWriter().write("您的上一次訪問時間是:"+accessTime_client); 29 }else{ 30 //第一次訪問 31 response.getWriter().write("您是第一次訪問"); 32 }
HttpSession session = request.getSession();
上述方法的內部原理:
當request在調用getSession方法時,內部會去查看一下該用戶是否在web應用的內部存在一塊內存區域,如果有直接返回這個內存區域的地址,如果沒有就創建一個新的session區域
服務器端通過什麼判斷用戶是否已經存在session的呢?
根據session的編號id--->JSESSIONID
創建:第一次調用request.getSession()
銷毀:
1)服務器關閉 session銷毀
2)session超時 默認30分鐘
計算點從何時開始:最後一次操作該站點後的30分鐘
3)手動銷毀session
session.invalidate();
Session是借助於Cookie的,同一個Session的標志就是JSESSIONID相同。
如果將浏覽器關閉,在打開訪問資源,會重新創建session
怎樣將session持久化----->存儲JSESSIONID的Cookie持久化
抓包工具獲得:
Set-Cookie: JSESSIONID=6232D4782FC69B1D780261E93DFA5FBB; Path=/day11_208/;
手動創建一個Cookie 在上面的cookie的基礎上 多一個max-age
1 //手動創建Cookie存儲JSESSIONID 2 //Set-Cookie: JSESSIONID=6232D4782FC69B1D780261E93DFA5FBB; Path=/home/; 3 Cookie cookie = new Cookie("JSESSIONID",session.getId()); 4 cookie.setPath("/home/"); 5 cookie.setMaxAge(60*10); 6 7 response.addCookie(cookie);
如果客戶端禁用Cookie,客戶端不能在存儲Cookie,JSESSIONID丟失,解決?
解決方案:URL重寫,在每個url地址後都使用分號;拼接JSESSIONID
1 HttpSession session = request.getSession(); 2 System.out.println(session.getId()); 3 String url = "/home/index.jsp"; 4 url = response.encodeRedirectURL(url); 5 System.out.println(url); 6 response.sendRedirect(url);
http://localhost/home/index.jsp;jsessionid=377B2F0501FF9FE643D7D88F4E883FFD