Session&Cookie

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信息。
http://localhost:8888/WEB16_Session&Cookie/訪問該路徑下全部的資源都攜帶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的持久化。
相關文章
相關標籤/搜索