04_web基礎(五)之cookie與session
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;CookieServlet9 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 }
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