會話技術簡介
- session和cookie都是會話技術
- 瀏覽購物網站,在沒有登陸的情況下把商品放入購物車(沒登陸,不存數據庫),然后搜索其他商品放入購物車,我們會訪問多個不同的網頁,但是我們所放入購物車的商品卻一直都存放著,即使跳轉了N個不同的頁面后(數據存放在域對象中session(存放在服務端),cookie(存放在客戶端))
會話技術
- 從打開客戶端訪問某個站點,到關閉這個瀏覽器的整個過程稱為一次會話
- 會話技術是記錄本次會話中客戶端的狀態(tài)與數據
- 會話技術分為Cookie和Session
- Cookie:數據存儲在客戶端本地,減少服務器端的存儲的壓力,安全性不好,客戶端可以清除cookie
- Session:將數據存儲到服務器端,安全性相對好,增加服務器的壓力
cookie
- Cookie技術是將用戶的數據存儲到客戶端的技術
- 服務器怎么把cookie寫給客戶端
- 服務器怎么獲取客戶端攜帶的cookie
- response把cookie信息放在響應頭(set-cookie)中返回給客戶端
服務端向客戶端發(fā)送一個cookie
- cookie通過響應頭發(fā)送給客戶端(Set-Cookie)
- 為什么不寫在響應體中的原因:響應體放的是客戶端顯示的內容
- 創(chuàng)建cookie
Cookie cookie = new Cookie(String name, String value);//cookie不支持中文
//cookie以響應頭的形式發(fā)送給客戶端
response.addCookie(cookie);
- cookie默認存儲的時間為一個會話的長度(默認cookie是會話級別的,存放在內存中)
為cookie設置持久化時間
- cookie.setMaxAge(int seconds); ---時間秒
- 如果不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉cookie信息銷毀(會話級別的cookie)
- 如果設置持久化時間,cookie信息會 被持久化到瀏覽器的磁盤文件里,過期瀏覽器 自動刪除該cookie信息
cookie.setMaxAge(int second)\\從會話級別的cookie轉為持久級別的cookie
設置Cookie的攜帶路徑
- 如果不設置攜帶路徑,那么該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息
- 如果設置了攜帶路徑,就只會在訪問指定的路徑中才會攜帶此cookie
- cookie.setPath():
//1、創(chuàng)建cookie對象
Cookie cookie = new Cookie("name","zhangsan");
//1.1 為cookie設置持久化時間 ---- cookie信息在硬盤上保存的時間
cookie.setMaxAge(10*60);//10分鐘 ---- 時間設置為0代表刪除該cookie
//1.2 為cookie設置攜帶的路徑
//cookie.setPath("/WEB16/sendCookie");//訪問sendCookie資源時才攜帶這個cookie
cookie.setPath("/WEB16");//訪問WEB16下的任何資源時都攜帶這個cookie
//cookie.setPath("/");//訪問服務器下的所有的資源都攜帶這個cookie
//2迫悠、將cookie中存儲的信息發(fā)送到客戶端---頭
response.addCookie(cookie);
刪除客戶端的cookie
- 如果想刪除客戶端的已經存儲的cookie信息,那么就使用同名同路徑的持久化時間為0的cookie進行覆蓋即可
//刪除客戶端保存 name=zhangsan的cookie信息
Cookie cookie = new Cookie("name","");
//將path設置成與要刪除cookie的path一致
cookie.setPath("/WEB16");
//設置時間是0
cookie.setMaxAge(0);
response.addCookie(cookie);
服務器獲取客戶端發(fā)送的cookie
- cookie信息是以請求頭的方式發(fā)送到服務器端的
- 通過request獲得所有的Cookie
Cookie[] cookies = request.getCookies();
- 遍歷Cookie數組辕坝,通過Cookie的名稱獲得我們想要的Cookie
//獲得客戶端攜帶的cookie的數據
Cookie[] cookies = request.getCookies();
//Cookie cookie = new Cookie("name","zhangsan");
//通過cookie名稱獲得想要的cookie
if(cookies!=null){
for(Cookie cookie : cookies){
//獲得cookie的名稱
String cookieName = cookie.getName();
if(cookieName.equals("name")){
//獲得該cookie的值
String cookieValue = cookie.getValue();
System.out.println(cookieValue);
}
}
}
通過cookie獲取用戶上次登陸的時間
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String lastTime = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equalsIgnoreCase("lastAccessTime")) {
lastTime = cookie.getValue();
}
}
}
if (lastTime == null) {
response.getWriter().write("歡迎登陸");
}else {
response.getWriter().write("歡迎登陸,你上次登陸時間為: " + lastTime);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(new Date());
Cookie cookie = new Cookie("lastAccessTime", format);
cookie.setMaxAge(60 * 10);//10分鐘
response.addCookie(cookie);
session
- Session技術是將數據存儲在服務器端的技術,會為每個客戶端都創(chuàng)建一塊內存空間存儲客戶的數據,但客戶端需要每次都攜帶一個標識ID去服務器中尋找屬于自己的內存空間
- 服務端開辟了存放session的內存,并把編號發(fā)給客戶端,客戶端存取數據時把session編號帶過去
- session技術是基于cookie的--存儲session編號(JSESSONID)
- 發(fā)送編號到服務器,根據編號去尋找session的位置是服務器與客戶端自動完成的,不需要自己手動編寫代碼(session比cookie更容易,就一個api)
- session是一個域對象
- 公司給你配了個保險柜放資料,你可以上下班帶回家(cookie),但是不安全,容易被人偷或者丟失.也可以放公司的保險柜里(session),但是你需要把鑰匙(sessionId)帶回家.
創(chuàng)建/獲取Session對象
- 獲得專屬于當前會話的Session對象,如果服務器端沒有該會話的Session對象會創(chuàng)建一個新的Session返回
- 如果已經有了屬于該會話的Session直接將已有 的Session返回
- 實質就是根據JSESSIONID判斷該客戶端是否在服務器上已經存在session了
//創(chuàng)建屬于該客戶端的session對象,如果存在,則獲取
HttpSession session = request.getSession();
向session中存取數據
- session也是一個域對象
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
Session面試題
- 你網session存放的數據沒了,是什么原因:
- 瀏覽器請掉cookie緩存了(JSESSIONID沒有了)
- session過期/失效了
- Session的生命周期(面試題或者筆試題,問的非常多)
創(chuàng)建:第一次執(zhí)行request.getSession()的時候創(chuàng)建
-
銷毀:
- 服務器關閉
- session過期/失效(默認30分鐘),時間的起算點:從不操作服務端資源開始時(web.xml)
<session-config> <session-timeout>30</session-timeout> </session-config>
- 手動銷毀session.invalidate()
- 瀏覽器關閉了Session就銷毀了嗎
- 不是
JSESSONID持久化
- 默認JSESSONID的cookie是會話級別的,把它設置成持久化級別的
- 手動創(chuàng)建一個存儲JSESSONID的cookie,為cookie設置持久化時間
//創(chuàng)建屬于該客戶端(會話)的私有的session區(qū)域
/* request.getSession()方法內部會判斷 該客戶端是否在服務器端已經存在session
* 如果該客戶端在此服務器不存在session 那么就會創(chuàng)建一個新的session對象
* 如果該客戶端在此服務器已經存在session 獲得已經存在的該session返回
*/
HttpSession session = request.getSession();
session.setAttribute("name", "jerry");
String id = session.getId();//該session對象的編號id
//手動創(chuàng)建一個存儲JSESSIONID的Cookie 為該cookie設置持久化時間
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setPath("/WEB16/");
cookie.setMaxAge(60*10);
response.addCookie(cookie);
response.getWriter().write("JSESSIONID:"+id);
驗證碼校驗功能
- web工程中讀取 文件痕钢,必須使用絕對磁盤路徑
- String path = getServletContext().getRealPath("/WEB-INF/new_words.txt");