Session&Cookie
session和cookie的做用,存無狀態的客戶端的數據。session是把無狀態的客戶端的數據存放在服務器當中,cookie是把無狀態的客戶端的數據存儲在客戶端本地。
1、會話技術
一、存儲客戶端的狀態
由一個問題引出今天的內容,例如網站的購物系統,用戶將購買的商品信息存儲到哪裏?由於Http協議是無狀態的,也就是說每一個客戶訪問服務器端資源時,服務器並不知道該客戶端是誰,因此須要會話技術識別客戶端的狀態。會話技術是幫助服務器記住客戶端狀態(區分客戶端)
二、會話技術
從打開一個瀏覽器訪問某個站點,到關閉這個瀏覽器的整個過程,成爲一次會話。會話技術就是記錄此次會話中客戶端的狀態與數據的。
會話技術分爲Cookie和Session:
Cookie:數據存儲在客戶端本地,減小服務器端的存儲的壓力,安全性很差,客戶端能夠清除cookie。
Session:將數據存儲到服務器端,安全性相對好,增長服務器的壓力。
2、Cookie技術
Cookie技術是將用戶的數據存儲到客戶端的技術,
第一,服務器端怎樣將一個Cookie發送到客戶端?
第二,服務器端怎樣接受客戶端攜帶的Cookie?
一、服務器端將一個Cookies發送到客戶端
a、建立Cookie(建立Cookie實例,設置Cookie的生命期限,向客戶端寫Cookie)
//一、建立cookie對象
Cookie cookie = new Cookie("name", "lisi");
//二、設置cookie的生命其餘
cookie.setMaxAge(24*3600);
//三、將cookie中存儲的信息發送到客戶端---頭
response.addCookie(cookie);
b、建立Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);
示例:Cookie cookie = new Cookie("username","zhangsan");
那麼該cookie會以響應頭的形式發送給客戶端:
注意:Cookie中不能存儲中文
c、設置Cookie在客戶端的持久化時間:
cookie.setMaxAge(int seconds); ---時間秒
注意:若是不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉cookie信息銷燬(會話級別的cookie),若是設置持久化時間,cookie信息會被持久化到瀏覽器的磁盤文件裏。
示例:
cookie.setMaxAge(10*60);
設置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘,過時瀏覽器自動刪除該cookie信息。
d、設置Cookie的攜帶路徑:
cookie.setPath(String path);
注意:若是不設置攜帶路徑,那麼該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息。
示例:
cookie.setPath("/WEB16");----表明訪問WEB16應用中的任何資源都攜帶cookie。
cookie.setPath("/WEB16/cookieServlet");---表明訪問WEB16中的cookieServlet時才攜帶cookie信息。
cookie.setPath("/"):表明訪問tomcat下全部的web應用都攜帶該cookie。
e、向客戶端發送cookie:
response.addCookie(Cookie cookie);
f、刪除客戶端的cookie:
若是想刪除客戶端的已經存儲的cookie信息,那麼就使用同名同路徑的持久化時間爲0的cookie進行覆蓋便可。
二、服務器端怎麼獲取客戶端攜帶的Cookie
cookie信息是以請求頭的方式發送到服務器端的:
Cookie:「name=zhangsan」
a、經過request得到全部的Cookie
Cookie[] cookies = request.getCookies();
b、經過遍歷Cookie數組,經過Cookie的名稱得到咱們想要的Cookie
if(cookies!=null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals("name")) {
String cookieValue = cookie.getValue();
}
}
}
案例:顯示用戶上次訪問的時間!
過程:
客戶端---->第一次訪問服務器端------->servlet (記住當前訪問的時間 new Date(),把當前時間以cookie的形式寫給客戶端)---------->set-cookie:lastAccessTime =2016-08-08 10:22:25--------->第二次訪問時,獲取客戶端攜帶名字叫lastAccessTime的之歌cookie,並獲取時間,顯示給用戶。
3、Session
Session技術是將數據存儲在服務器端的技術,會爲每一個客戶端都建立一塊內存空間存儲客戶的數據,但客戶端須要每次都攜帶一個標識ID去服務器中尋找屬於本身的內存空間。因此說session的實現是基於Cookie,Session須要藉助於Cookie存儲客戶的惟一性標識JSESSIONID。Session技術基於Cookie---Cookie存儲session編號。
注意:發送編號和根據編號去尋找session區域位置,這些操做是客戶端和服務器自動完成的,不須要手動編碼。
Session須要學習以下三個問題:
怎樣得到屬於本客戶端的session對象(內存區域)?
怎樣向session中存取數據(session也是一個域對象)?
session對象的生命週期?
一、得到Session對象
//建立屬於該客戶端(會話)的私有的session區域
HttpSession session = request.getSession();
String id = session.getId();//該session對象的id
此方法會得到專屬於當前會話的Session對象,若是服務器端沒有該會話的Session對象會建立一個新的Session返回,若是已經有了屬於該會話的Session直接將已有的Session返回(實質就是根據JSESSIONID判斷該客戶端是否在服務器上已經存在session了)。
二、怎樣向Session中存取數據(session也是一個域對象)
Session也是存儲數據的區域對象,因此session對象也具備以下三個方法:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
三、Session對象的生命週期(面試題和筆試題)
建立:第一次執行request.getSession()時建立
銷燬:
a、服務器(非正常)關閉時
b、session過時/失效(默認30分鐘)
問題:時間的起算點,從什麼時候開始計算30分鐘?
從不操做服務器端的資源開始計時。
能夠在工程的web.xml中進行配置:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
c、手動銷燬session
session.invalidate();
session做用範圍:
默認在一次會話中,也就是說在一次會話中任何資源公用一個session對象。
面試題:瀏覽器關閉,session就銷燬了?(不對)
sessionOne:
//建立屬於該客戶端(會話)的私有的session區域
HttpSession session = request.getSession();
String id = session.getId();//該session對象的id
session.setAttribute("name", "jerry");
response.getWriter().write("JSESSIONID: "+id);
sessionTwo:
//從session中得到存儲的數據
HttpSession session = request.getSession();
String attribute = (String) session.getAttribute("name");
response.getWriter().write(attribute);
在上述代碼中,依次打開,可以獲取到session的值。但當關閉瀏覽器,再次訪問sessionTwo時,顯示爲null。爲何?應爲該次操做cookie是會話級別,須要程序修改成持久級別就ok。
代碼修改:
sessionOne:
//建立屬於該客戶端(會話)的私有的session區域
HttpSession session = request.getSession();
String id = session.getId();//該session對象的id
//手動建立一個存儲JSESSIONID的Cookie,爲該cookie設置持久化時間
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setPath("/WEB16_Session&Cookie/");
cookie.setMaxAge(24*3600);
response.addCookie(cookie);
session.setAttribute("name", "jerry");
response.getWriter().write("JSESSIONID: "+id);
sessionTwo代碼不用修改。若是直接訪問sessionTwo,獲取的sessionId值同樣。
4、驗證碼校驗功能實現和總結。
//設置request的編碼
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//驗證碼的校驗
//一、獲取輸入的驗證碼
String checkCode = request.getParameter("checkCode");
//response.getWriter().write(checkCode);
//二、獲取生成圖片的文字的驗證碼
String checkcode_session = (String) request.getSession().getAttribute("checkcode_session");
//response.getWriter().write(checkcode_session);
//三、對比頁面的驗證碼和輸入的文字驗證碼對比是否一致
if (!checkcode_session.equals(checkCode)) {
request.setAttribute("loginInfo", "您的驗證碼不正確");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
//獲取頁面的用戶名和密碼進行校驗
//......
總結:
會話技術:
Cookie技術:存儲到客戶端
一、發送cookie
Cookie cookie = new Cookie(name,value)
cookie.setMaxAge(秒);
cookie.setPath("");
response.addCookie(cookie);
二、得到Cookie
Cookie[] cookies = request.getCookies();
cookie.getValue();
Session技術:存儲到服務器端,藉助Cookie存儲JSESSIONID
HttpSession session = request.getSession();
setAttribute(name,value);
getAttribute(name);
session生命週期:
建立:第一次之多request.getSession();
銷燬:服務器關閉,session 失效、過時,session.invalidate();
session做用範圍:默認一次會話中。
session的持久化。