1. 程式人生 > >04_web基礎(五)之cookie與session

04_web基礎(五)之cookie與session

blog 輸出 import inter 會話跟蹤 問題 odi close 成功

29.Http協議無記憶帶來的問題

  什麽是會話:
可簡單理解為:用戶開一個瀏覽器,訪問某一個web站點,在這個站點點擊多個超鏈接,訪問服務器多個web資源,然後關閉瀏覽器,整個過程稱之為一次會話。


在一次會話中,可以點擊多個超鏈接,可以看到多張圖片,多個樣式等,每一個資源都是發送一個請求和響應得到的.
在一次會話中,包含多次請求.

什麽是會話跟蹤:
HTTP是無狀態協議,沒有記憶力,不知道哪一個客戶端請求了自己,每個請求之間無法共享數據。這就無法知道會話什麽時候開始,什麽時候結束,也無法確定發出請求的用戶身份。
在一次會話中多次請求共享數據即會話跟蹤技術.
需求:實現會話跟蹤的解決方案:
解決在一次會話中多個請求不能共享數據的問題.
---------------------------------------------------------------------
解決方案:
1:使用參數機制在多個請求之間傳遞.
可以完成功能,但是不可行(不安全,在瀏覽器地址欄暴露了所有信息.)
不安全的註意問題:把信息暴露在地址欄.
解決方案:讓信息不顯示在瀏覽器地址欄, 就是Cookie
2:Cookie:
放在請求頭中:
3:Session:
什麽是會話:
可簡單理解為:用戶開一個瀏覽器,訪問某一個web站點,在這個站點點擊多個超鏈接,訪問服務器多個web資源,然後關閉瀏覽器,整個過程稱之為一次會話。


在一次會話中,可以點擊多個超鏈接,可以看到多張圖片,多個樣式等,每一個資源都是發送一個請求和響應得到的.
在一次會話中,包含多次請求.

什麽是會話跟蹤:
HTTP是無狀態協議,沒有記憶力,不知道哪一個客戶端請求了自己,每個請求之間無法共享數據。這就無法知道會話什麽時候開始,什麽時候結束,也無法確定發出請求的用戶身份。
在一次會話中多次請求共享數據即會話跟蹤技術.
需求:實現會話跟蹤的解決方案:
解決在一次會話中多個請求不能共享數據的問題.
---------------------------------------------------------------------
解決方案:
1:使用參數機制在多個請求之間傳遞.
可以完成功能,但是不可行(不安全,在瀏覽器地址欄暴露了所有信息.)
不安全的註意問題:把信息暴露在地址欄.
解決方案:讓信息不顯示在瀏覽器地址欄, 就是Cookie
2:Cookie:
放在請求頭中:
3:Session:

30.31.32.cookie

  Cookie的操作:
1):創建Cookie和設置共享數據:
Cookie c = new Cookie(String name,String value);
Cookie c = new Cookie("curreentName","wuji");
2):把Cookie放入響應中,把Cookie的共享數據傳遞給瀏覽器,由瀏覽器保存.
response對象.addCookie(c);
3):獲取Cookie和Cookie中的數據.(從請求中獲取)

4):Cookie的name和value不支持中文.
解決方案:對中文做編碼和解碼.
//放:
String msg="你好";
String encode = URLEncoder.encode(msg, "UTF-8");
System.out.println(encode);
Cookie c2 = new Cookie("curreentName2",encode);
//取:
String name = cookie.getName();
String value = cookie.getValue();
String decode = URLDecoder.decode(value, "UTF-8");

5):修改Cookie指定名的value值.
方式1: 根據name獲取被修改的Cookie對象,在調用setValue方法即可.
方式2: 重新創建一個同名的Cookie.

註意:修改之後,要調用response對象.addCookie(c);

6):Cookie的生命周期:(Cookie中的共享數據可以保留多久)
缺省情況:關閉瀏覽器Cookie就丟失了.
通過Cookie對象的setMaxAge(int seconds):設置Cookie可以存活多久.
seconds>0:可以存活多少秒.
seconds<0:存放在瀏覽器進程中,閉瀏覽器Cookie就丟失了.
seconds=0:刪除Cookie.
7):刪除Cookie:
Cookie對象.setMaxAge(0);
8):Cookie的缺陷.
1>:中文處理麻煩.
2>:多人共用同一臺電腦,信息不安全.
3>:一個Cookie只能存儲一個簡單類型的數據.
若要同時存儲,賬號,密碼,郵件等等.
主要的原因是:Cookie的value只能存儲String,不能存Object.
4>:Cookie的大小和數量限制:
Cookie大小限制在4KB之內;

* 一臺服務器在一個客戶端最多保存20個Cookie;

* 一個瀏覽器最多可以保存300個Cookie;
5>:Cookie的原理:把共享數據存儲在瀏覽器中.
每次請求,再把共享數據帶到服務端.

代碼:

技術分享圖片
 1 package com.day07.web.demo2.controller;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.annotation.WebServlet;
 5 import javax.servlet.http.Cookie;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
9 import java.io.IOException; 10 import java.io.PrintWriter; 11 12 /** 13 * Created by Administrator on 2017/12/7. 14 */ 15 @WebServlet("/cookie") 16 public class CookieServlet extends HttpServlet { 17 @Override 18 public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 19 //請求亂碼處理 20 req.setCharacterEncoding("utf-8"); 21 //響應亂碼處理 22 resp.setContentType("text/html;charset=UTF-8"); 23 //操作cookie 24 25 //增加 26 Cookie cookie1 = new Cookie("name1","wuji1"); 27 resp.addCookie(cookie1); 28 Cookie cookie2 = new Cookie("name2","wuji2"); 29 resp.addCookie(cookie2); 30 //刪除 31 /* 6):Cookie的生命周期:(Cookie中的共享數據可以保留多久) 32 缺省情況:關閉瀏覽器Cookie就丟失了. 33 通過Cookie對象的setMaxAge(int seconds):設置Cookie可以存活多久. 34 seconds>0:可以存活多少秒. 35 seconds<0:存放在瀏覽器進程中,閉瀏覽器Cookie就丟失了. 36 seconds=0:刪除Cookie. 37 7):刪除Cookie: 38 Cookie對象.setMaxAge(0);*/ 39 cookie1.setMaxAge(0); 40 //必須 resp.addCookie(cookie); 才可以生效 41 resp.addCookie(cookie1); 42 //修改 43 44 //查詢 45 46 //獲取輸出對象 47 PrintWriter writer = resp.getWriter(); 48 //輸出信息 49 writer.println("你好師姐!"); 50 51 52 } 53 }
CookieServlet

技術分享圖片
 1 package com.day07.web.demo2.controller;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.annotation.WebServlet;
 5 import javax.servlet.http.Cookie;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import java.io.IOException;
10 import java.io.PrintWriter;
11 
12 /**
13  * Created by Administrator on 2017/12/7.
14  */
15 @WebServlet("/cookie2")
16 public class Cookie2Servlet extends HttpServlet {
17     @Override
18     public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
19         //請求亂碼處理
20         req.setCharacterEncoding("utf-8");
21         //響應亂碼處理
22         resp.setContentType("text/html;charset=UTF-8");
23         //操作cookie
24 
25         //刪除
26         //修改
27          
28         //查詢
29         Cookie[] cookies = req.getCookies();
30         for (int i=0;i<cookies.length;i++){
31             Cookie cookie = cookies[i];
32             //取key
33             String name = cookie.getName();
34             //取值
35             String value = cookie.getValue();
36             //打印
37             System.out.println(name+"="+value);
38 
39             cookie.setValue("zhaoming");
40             resp.addCookie(cookie);
41         }
42 
43         //獲取輸出對象
44         PrintWriter writer = resp.getWriter();
45         //輸出信息
46         writer.println("你好師姐----獲取cookie的數據!");
47 
48 
49     }
50 }
Cookie2Servlet

33.session簡單使用

  Session的操作:
1):獲取Session對象/創建Session對象.
HttpSession session = request對象.getSession();等同於getSession(true);
HttpSession session = request對象.getSession(true);:如果當前有Session對象,就直接返回,若沒有,則先創建一個再返回.
HttpSession session = request對象.getSession(false);:如果當前有Session對象,就直接返回,若沒有,則返回null.

2):把共享數據存儲在Session中.
Session對象.setAttribute(String name,Object value);
session.setAttribute("currentName","Helloword");

3):從Session中獲取共享數據:
Object val = session.getAttribute("currentName");

4):修改Session中的共享數據.
重新設置一個同名的屬性名
session.setAttribute("currentName","世界你好!");

5):刪除Session中的共享數據.從Session中刪除指定名的屬性值.
session.removeAttribute( "cuurentName");
6):Session的規範命名:
1):一般,根據我們隊大師的研究,發現session中的屬性名,習慣起名為:XXX_IN_SESSION.
2):把登陸信息封裝在一個對象中,再存儲到Session中.
LoginUser user = new LoginUser("無忌",.....);
session.setAttribute("USER_IN_SESSION",user);


7):銷毀Session對象(註銷登錄):
session.removeAttribute("USER_IN_SESSION")方法,只能刪除Session中指定名稱的屬性.
session.invalidate():銷毀整個Session對象.

8):Session的超時管理.
session.setMaxInactiveInterval(int seconds);
session.setMaxInactiveInterval(15);若上一次操作之後,15內不再次和該網頁交互,則Session會被自動銷毀.
兩次操作的間隔時間不能超過15秒,若超過自動銷毀Session.
一般的,不需要我們去設置,在Tomcat中,默認的超時時間為30分鐘(一般在20分鐘就被銷毀了).
  技術分享圖片

  代碼:

技術分享圖片
 1 package com.day07.web.demo2.controller;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.ServletRequest;
 5 import javax.servlet.ServletResponse;
 6 import javax.servlet.annotation.WebServlet;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 import javax.servlet.http.HttpSession;
11 import java.io.IOException;
12 import java.io.PrintWriter;
13 
14 /**
15  * 課程筆記:http://www.cnblogs.com/newAndHui/category/1153640.html
16  * 疑問咨詢wx:851298348
17  */
18 @WebServlet("/session")
19 public class SessionServlet extends HttpServlet {
20     @Override
21     public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
22         //session   存放數據    位置:服務器   作用範圍:整個瀏覽器
23        //命名規範 一般,根據我們隊大師的研究,發現session中的屬性名,習慣起名為:XXX_IN_SESSION.
24         //怎麽存
25              //先獲得session對象
26         HttpSession session = req.getSession();
27         session.setAttribute("NAME_IN_SESSION","wuji");
28         //怎麽取
29         String name =(String) session.getAttribute("NAME_IN_SESSION");
30         System.out.println("-------name-----"+name);
31         //怎麽修改
32         session.setAttribute("NAME_IN_SESSION","wuji2");
33         //怎麽刪除
34         session.removeAttribute("NAME_IN_SESSION");
35        //向頁面輸出
36         PrintWriter writer = res.getWriter();
37         writer.print("================"+name);
38     }
39 }
SessionServlet

技術分享圖片
 1 package com.day07.web.demo2.controller;
 2 
 3 import javax.servlet.ServletException;
 4 import javax.servlet.annotation.WebServlet;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import javax.servlet.http.HttpSession;
 9 import java.io.IOException;
10 import java.io.PrintWriter;
11 
12 /**
13  * 課程筆記:http://www.cnblogs.com/newAndHui/category/1153640.html
14  * 疑問咨詢wx:851298348
15  */
16 @WebServlet("/session2")
17 public class Session2Servlet extends HttpServlet {
18     @Override
19     public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
20         //session   存放數據    位置:服務器
21         //怎麽存
22              //先獲得session對象
23         HttpSession session = req.getSession();
24 
25         //怎麽取
26         String name =(String) session.getAttribute("name");
27         System.out.println("-------name-----"+name);
28         //怎麽修改
29 
30         //怎麽刪除
31 
32        //向頁面輸出
33         PrintWriter writer = res.getWriter();
34         writer.print("================"+name);
35     }
36 }
Session2Servlet

04_web基礎(五)之cookie與session