會話:從打開一個浏覽器,訪問某個網站,到關閉這個浏覽器的這個過程稱為一次會話。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