會話:使用者打開浏覽器,通路web伺服器的資源,會話建立,直接有一方斷開連接配接,會話結束,在一次會話中可以包含多次請求和響應
會話跟蹤:一種維護浏覽器狀态的方法,伺服器需要識别多次請求是否來自于同一個浏覽器,以便在同一次會話的多次請求間共享資料
HTTP協定是無狀态的,每次浏覽器向伺服器請求時,伺服器都會将請求視為新的請求,是以我們需要會話跟蹤技術來實作會話内資料共享
實作方式:
1、用戶端會話跟蹤技術:Cookie
2、伺服器會話跟蹤技術:Session
Cookie的基本使用
Cookie:用戶端會話技術,将資料儲存到用戶端,以後每次請求都攜帶Cookie資料進行通路
發送Cookie
1、建立Cookie對象,設定資料
Cookie cookie=new Cookie("key","value");
2、發送Cooker到用戶端:使用response對象
response.addCookie(cookie);
package top.wogong.web.Cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookie2")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//向用戶端發送Cookie
//1、建立Cookie
Cookie cookie=new Cookie("username","zhangsan");
//設定Cookie存活時間
cookie.setMaxAge(60*60*24*7);
//2、發送Cookie
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
擷取Cookie
3、擷取用戶端攜帶的所有Cookie,使用request對象
Cookie[] cookies=request.getCookies();
4、變量數組,擷取每個Cookie對象:for
5、使用Cookie對象方法擷取資料
cookie.getName();
cookie.getValue();
package top.wogong.web.Cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/getcookie")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//擷取cookie
//1、擷取cookie數組
Cookie[] cookies =req.getCookies();
//2、周遊cookie數組
for(Cookie cookie:cookies){
String name=cookie.getName();
if(name.equals("username")){
String value = cookie.getValue();
System.out.println(value);
break;
}
}
}
}
cookie原理
Cookie的實作是基于HTTP協定
響應頭:set-cookie
請求頭:cookie
cookie使用細節
Cookie存活時間
預設情況下,Cookie存儲在浏覽器記憶體中,當浏覽器關閉,記憶體釋放,則Cookie被銷毀
設定Cookie的存活時間
setMaxAge(int seconds);
//1、正數;将Cookie寫入浏覽器所在的電腦的硬碟,持久化存儲,到時間自動删除
//2、負數:預設值,Cookie在目前浏覽器記憶體中,當浏覽器關閉,則Cookie被銷毀
//3、零:删除對應Cookie
Cookie存儲中文
Cookie預設情況下不能存儲中文
如需要存儲,則需要進行轉碼:URL編碼
Session
伺服器端會話跟蹤技術:将資料儲存到伺服器
JavaEE提供HttpSession接口,來實作一次會話的多次請求間資料共享功能
使用:
1、擷取Session對象
HttpSession session =request.getSession();
2、Sesion對象功能
存儲資料到session域中
void setAttribute(String name,Object o);
根據key,擷取值
Object getAttribute(String name);
根據key,删除該鍵值對
void removeAttribute(String name);
Session原理
Session是基于Cookie實作的
Session使用細節
Session鈍化、活化
伺服器重新開機後,Session中資料是否還存在
鈍化:在伺服器正常關閉後,Tomcat會自動将Session資料寫入硬碟檔案中
活化:再次啟動伺服器後,從檔案中加載資料到Session中
Session銷毀
預設情況下,無操作,30分鐘自動銷毀
在session設定自動銷毀時間
<session>
<sessionitimeout>30</session-timeout>
</session>
調用Session對象的invalidate()方法銷毀Session
小結
Cookie和Session都是來完成一次會話内多次請求間資料共享
差別:
存儲位置:Cookie是将資料存儲在用戶端,Session将資料存儲在伺服器
安全性:Cookie不安全,Session安全
資料大小:Cookie最大3KB,Session無大小限制
存儲時間:Cookie可以長期存儲,Session預設存儲30分鐘
伺服器性能:Cookie不占用伺服器,Session占用伺服器資源