一、HTTP協議
HTTP協議是一個無狀態協議,服務器無法判斷若干個請求是否來自同一個浏覽器,無法與浏覽器進行會話。
二、HTTP會話控制:Cookie
Cookie技術是使用在浏覽器端的一種緩存技術,
在浏覽器第一次向服務器發出請求,在服務器端會創建Cookie對象,並以鍵值對的形式在響應頭中返回。下一次向服務器發送請求時,會在請求頭中將Cookie信息攜帶。
1.Cookie的創建與返回
在服務器端通過 new Cookie(key, value)的方式創建。
並以response.addCookie(cookie)的方式返回給浏覽器。
(2)Cookie的獲取
在服務器端通過request.getCookies()方法獲取,得到一個Cookie數組
如果Cookie數組不包含Cookie,則Cookie數組為null。
(3)Cookie的時效(setMaxAge(seconds))
會話級:保存在浏覽器運行過程內存中,浏覽器一關閉,Cookie就失效。(seconds為負數),默認。
持久化:保存在本地文件系統中,保存(seconds)長。(seconds為正數)。
(4)刪除Cookie
setMaxAge(0)
三、HTTP會話控制:Session
Session技術是使用在服務器端的一種緩存技術,但是它依賴於Cookie。
1.浏覽器請求信息中不包含JSESSIONID的Cookie
服務器端會通過getSession來創建一個Session對象。
創建一個name值為JSESSIONID的Cookie返回給浏覽器
2.請求信息中包含JSESSIONID的Cookie
根據JSESSIONID的值,在服務器端查找已經存在的Session對象
①若能找到,則返回找到的Session對象(Session對象以鍵值對的形式保存在服務器端)
②若找不到,則創建一個Session對象,並返回JSESSIONID的Cookie(包含偽造JSESSIONID的情況)
3.Session對象持久化
HttpSession session = request.getSession(); String id = session.getId(); Cookie cookie = new Cookie("JSESSIONID", id); cookie.setMaxAge(30); response.addCookie(cookie);
4.設置Session對象的有效時間
HttpSession session = request.getSession(); session.setMaxInactiveInterval(10);
5.設置Session強制失效
HttpSession session = request.getSession(); session.invalidate();
6.若浏覽器禁用Cookie,可以通過Session的URL重寫
HttpSession session = request.getSession(); session.setAttribute("attrName", "testValue"); String url = "target url"; url = response.encodeURL(url); response.sendRedirect(url);
★如果目標頁面也需要使用保持Session會話,則同樣需要實現URL重寫
String url = response.encodeURL(request.getContextPath()+"/nextTarget.jsp");
四、 需要注意的幾點:
1.Session的空閒時間:Session對象沒有被浏覽器端訪問的時間間隔
2.關於 request.getSession()
當前Servlet是客戶端訪問的第一個Web資源則創建Session對象。這裡有一個特殊情況,就是JSP頁面上使用page指令指定了session="false",這時不會創建Session對象。
3.關於 session=“false”
當前頁面禁用session隱含變量,但是可以使用其他顯式的HttpSession對象。
五、總結:
說白了,Cookie就是服務器端和浏覽器端通信的一個識別碼。
HTTP是一個無狀態的協議,服務器和浏覽器之間的會話是通過Cookie來維系的(JSESSIONID),Session是建立在Cookie之上來使用的。