Servlet cookie和session的簡介和作用
接下來博主將會為大家介紹javaweb中的session和cookie,在最後還會提供幾種session或者cookie的應用場景,以及應用的思路
先上總結,然後下面是細緻地解析喔~
總結
-
Cookie
伺服器給客戶端傳送一小份資料, 存放在客戶端上。
基本用法:
新增cookie 獲取cookie。
演練例子:
1. 獲取上一次訪問時間 2. 獲取商品瀏覽記錄。
-
什麼時候有cookie
response.addCookie(new Cookie())
-
Cookie 分類
會話Cookie 關閉瀏覽器,就失效 持久cookie 存放在客戶端上。 在指定的期限內有效。 setMaxAge();
-
Session
也是基於cookie的一種會話技術, 資料存放存放在伺服器端 會在cookie裡面新增一個欄位 JSESSIONID . 是tomcat伺服器生成。 setAttribute 存資料 getAttribute 取資料 removeAttribute 移除資料 getSessionId(); 獲取會話id invalidate() 強制讓會話失效。
-
建立和銷燬
,呼叫request.getSesion建立
伺服器關閉 , 會話超時(30分)
setAttribute 存放的值, 在瀏覽器關閉後,還有沒有。 有!,就算客戶端把電腦砸了也還有。
前言
對於cookie和session中,他們是在會話中發生作用的
什麼是會話
也就相當於打電話,兩個人能夠互相通話
會話過程中要解決什麼問題
保持各個客戶端自己的資料。
Cookie
由於Cookie資料是由客戶端來儲存和攜帶的,所以稱之為客戶端技術。
簡介
- Cookie
餅乾. 其實是一份小資料, 是伺服器給客戶端,並且儲存在客戶端上的一份小資料
- 應用場景
自動登入、瀏覽記錄、購物車。
- 為什麼要有這個Cookie
http的請求是無狀態。 客戶端與伺服器在通訊的時候,是無狀態的,其實就是客戶端在第二次來訪的時候,伺服器根本就不知道這個客戶端以前有沒有來訪問過。 為了更好的使用者體驗,更好的互動 [自動登入],其實從公司層面講,就是為了更好的收集使用者習慣[大資料]
1、屬性:
name:名稱不能唯一確定一個Cookie。路徑可能不同。
value:不能存中文。
path:預設值是寫Cookie的那個程式的訪問路徑
比如:http://localhost:8080/day10_00_cookie/servlet/ck1寫的Cookie
path就是:/day10_00_cookie/servlet 看當前建立cookie的資源(servlet)檔案路徑
客戶端在訪問伺服器另外資源時,根據訪問的路徑來決定是否帶著Cookie到伺服器
當前訪問的路徑如果是以cookie的path開頭的路徑,瀏覽器就帶。否則不帶。
maxAge:cookie的快取時間。預設是-1(預設存在瀏覽器的記憶體中)。單位是秒。
負數:cookie的資料存在瀏覽器快取中
0:刪除。路徑要保持一致,否則可能刪錯人。
正數:快取(持久化到磁碟上)的時間
Cookie怎麼用
簡單使用:
-
新增Cookie給客戶端
-
在響應的時候,新增cookie
Cookie cookie = new Cookie("aa", "bb"); //給響應,新增一個cookie response.addCookie(cookie);
-
客戶端收到的資訊裡面,響應頭中多了一個欄位 Set-Cookie
-
-
獲取客戶端帶過來的Cookie
//獲取客戶端帶過來的cookie Cookie[] cookies = request.getCookies(); if(cookies != null){ for (Cookie c : cookies) { String cookieName = c.getName(); String cookieValue = c.getValue(); System.out.println(cookieName + " = "+ cookieValue); } }
-
常用方法
//關閉瀏覽器後,cookie就沒有了。 ---> 針對沒有設定cookie的有效期。 // expiry: 有效 以秒計算。 //正值 : 表示 在這個數字過後,cookie將會失效。 //負值: 關閉瀏覽器,那麼cookie就失效, 預設值是 -1 cookie.setMaxAge(60 * 60 * 24 * 7); //賦值新的值 //cookie.setValue(newValue); //用於指定只有請求了指定的域名,才會帶上該cookie cookie.setDomain(".itheima.com"); //只有訪問該域名下的cookieDemo的這個路徑地址才會帶cookie cookie.setPath("/CookieDemo");
例子一 顯示最近訪問的時間。
-
判斷賬號是否正確
-
如果正確,則獲取cookie。 但是得到的cookie是一個數組, 我們要從數組裡面找到我們想要的物件。
-
如果找到的物件為空,表明是第一次登入。那麼要新增cookie
-
如果找到的物件不為空, 表明不是第一次登入。
if("admin".equals(userName) && "123".equals(password)){ //獲取cookie last-name --- > Cookie [] cookies = request.getCookies(); //從數組裡面找出我們想要的cookie Cookie cookie = CookieUtil.findCookie(cookies, "last"); //是第一次登入,沒有cookie if(cookie == null){ Cookie c = new Cookie("last", System.currentTimeMillis()+""); c.setMaxAge(60*60); //一個小時 response.addCookie(c); response.getWriter().write("歡迎您, "+userName); }else{ //1. 去以前的cookie第二次登入,有cookie long lastVisitTime = Long.parseLong(cookie.getValue()); //2. 輸出到介面, response.getWriter().write("歡迎您, "+userName +",上次來訪時間是:"+new Date(lastVisitTime)); //3. 重置登入的時間 cookie.setValue(System.currentTimeMillis()+""); response.addCookie(cookie); } }else{ response.getWriter().write("登陸失敗 "); }
例子二: 顯示商品瀏覽記錄。
準備工作
-
拷貝基礎課第一天的 htmll原型檔案,到工程的WebContent裡面。
-
在WebContent目錄下新建一個jsp檔案, product_list.jsp, 然後拷貝原來product_list.html的內容到jsp裡面。 建好之後,jsp裡面的所有ISO-8859-1 改成 UTF-8
拷貝html標籤的所有內容。 替換jsp的html標籤即可
-
修改product_info.htm裡面的手機數碼超連結地址
<li class="active"><a href="product_list.jsp">手機數碼<span class="sr-only">(current)</span></a></li>
-
修改首頁(index.html)頂部的手機數碼跳轉的位置為 product_list.jsp
<li class="active"><a href="product_list.jsp">手機數碼<span class="sr-only">(current)</span></a></li>
分析
Jsp 裡面使用Java程式碼
- jsp
Java Server Pager —> 最終會翻譯成一個類, 就是一個Servlet
-
定義全域性變數
<%! int a = 99; %>
-
定義區域性變數
<% int b = 999; %>
-
在jsp頁面上,顯示 a 和 b的值,
<%=a %>
<%=b %>
jsp顯示瀏覽記錄
清除瀏覽記錄
其實就是清除Cookie, 刪除cookie是沒有什麼delete方法的。只有設定maxAge 為0 。
Cookie cookie = new Cookie("history","");
cookie.setMaxAge(0); //設定立即刪除
cookie.setPath("/CookieDemo02");
response.addCookie(cookie);
Cookie總結
-
伺服器給客戶端傳送過來的一小份資料,並且存放在客戶端上。
-
獲取cookie, 新增cookie
request.getCookie();
response.addCookie();
-
Cookie分類
會話Cookie
預設情況下,關閉了瀏覽器,那麼cookie就會消失。持久Cookie
在一定時間內,都有效,並且會儲存在客戶端上。 cookie.setMaxAge(0); //設定立即刪除 cookie.setMaxAge(100); //100 秒
-
Cookie的安全問題。
由於Cookie會儲存在客戶端上,所以有安全隱患問題。 還有一個問題, Cookie的大小與個數有限制。 為了解決這個問題 —> Session .
客戶端禁用Cookie後的會話資料儲存問題
客戶端禁用cookie:瀏覽器永遠不會向伺服器傳送cookie的請求訊息頭
解決方案:
方案一:在主頁上給出提示:請不要禁用您的cookie
方案二:URL重寫。必須對網站的所有地址都重寫。
http://url—>http://url;JSESSIONID=111
response.encodeURL(String url);
看瀏覽器有沒有傳送cookie請求訊息頭,沒有就重寫URL,有就不重寫。
request.getSession();必須寫
當然,如果希望簡單快捷地使用cookie ,可以瞭解下cookie.jar喔~
HttpSession
簡介
Session
會話 , Session是基於Cookie的一種會話機制。 Cookie是伺服器返回一小份資料給客戶端,並且存放在客戶端上。 Session是,資料存放在伺服器端。
-
常用API
//得到會話ID String id = session.getId(); //存值 session.setAttribute(name, value); //取值 session.getAttribute(name); //移除值 session.removeAttribute(name);
-
Session何時建立 , 何時銷燬?
-
建立
如果有在servlet裡面呼叫了 request.getSession()
- 銷燬
session 是存放在伺服器的記憶體中的一份資料。 當然可以持久化. Redis . 即使關了瀏覽器,session也不會銷燬。
關閉伺服器
session會話時間過期。 有效期過了,預設有效期: 30分鐘。
- 1、為什麼要學HttpSession?
它也是一個域物件: session servletContext request
同一個會話下,可以使一個應用的多個資源共享資料
cookie客戶端技術,只能存字串。HttpSession伺服器端的技術,它可以存物件。
- 2、常用方法
把資料儲存在HttpSession物件中,該物件也是一個域物件。
void setAttribute(String name,Object value);
Object getAttribute(String name);
void removeAttribute(String name);
HttpSession.getId():
setMaxInactiveInterval(int interval) 設定session的存活時間
invalidate() 使此會話無效
3、getSession():內部執行原理
HttpSession request.getSession():內部執行原理
-
1、獲取名稱為JSESSIONID的cookie的值。
-
2、沒有這樣的cookie,建立一個新的HttpSession物件,分配一個唯一的SessionID,並且向客戶端寫了一個名字為JSESSIONID=sessionID的cookie
-
3、有這樣的Cookie,獲取cookie的值(即HttpSession物件的值),從伺服器的記憶體中根據ID找那個HttpSession物件:
找到了:取出繼續為你服務。
找不到:從2開始。 -
HttpSession request.getSession(boolean create):
引數:
true:和getSession()功能一樣。
false:根據客戶端JSESSIONID的cookie的值,找對應的HttpSession物件,找不到返回null(不會建立新的,只是查詢)。
session的狀態圖
例子三: 簡單購物車。
CartServlet 程式碼
response.setContentType("text/html;charset=utf-8");
//1. 獲取要新增到購物車的商品id
int id = Integer.parseInt(request.getParameter("id")); // 0 - 1- 2 -3 -4
String [] names = {"Iphone7","小米6","三星Note8","魅族7" , "華為9"};
//取到id對應的商品名稱
String name = names[id];
//2. 獲取購物車存放東西的session Map<String , Integer> iphoen7 3
//把一個map物件存放到session裡面去,並且保證只存一次。
Map<String, Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");
//session裡面沒有存放過任何東西。
if(map == null){
map = new LinkedHashMap<String , Integer>();
request.getSession().setAttribute("cart", map);
}
//3. 判斷購物車裡面有沒有該商品
if(map.containsKey(name)){
//在原來的值基礎上 + 1
map.put(name, map.get(name) + 1 );
}else{
//沒有購買過該商品,當前數量為1 。
map.put(name, 1);
}
//4. 輸出介面。(跳轉)
response.getWriter().write("<a href='product_list.jsp'><h3>繼續購物</h3></a><br>");
response.getWriter().write("<a href='cart.jsp'><h3>去購物車結算</h3></a>");
移除Session中的元素
//強制幹掉會話,裡面存放的任何資料就都沒有了。
session.invalidate();
//從session中移除某一個數據
//session.removeAttribute("cart");
其他例子
提供其他cookie session應用場景下面的思路分析給大家參考: