java--Cookie和Session

會話技術Cookie&Session

會話技術簡介

存儲客戶端的狀態

由一個問題引出今天的內容,例如網站的購物系統,用戶將購買的商品信息存儲到哪裏?由於Http協議是無狀態的,也就是說每一個客戶訪問服務器端資源時,服務器並 不知道該客戶端是誰,因此須要會話技術識別客戶端的狀態。會話技術是幫助服務器記住客戶端狀態(區分客戶端)web

會話技術

從打開一個瀏覽器訪問某個站點,到關閉這個瀏覽器的整個過程,成爲一次會話。會話技術就是記錄此次會話中客戶端態的狀態與數據的。數組

會話技術分爲Cookie和Session:瀏覽器

Cookie:數據存儲在客戶端本地,減小服務器端的存儲的壓力,安全性很差,客戶端 能夠清除cookie安全

Session:將數據存儲到服務器端,安全性相對好,增長服務器的壓力服務器

Cookie技術

Cookie技術是將用戶的數據存儲到客戶端的技術,分爲兩方面:cookie

第一,服務器端怎樣將一個Cookie發送到客戶端session

第二,服務器端怎樣接受客戶端攜帶的Cookie學習

服務器端向客戶端發送一個Cookie

1)建立Cookie:網站

Cookie cookie = new Cookie(String cookieName,String cookieValue);

示例:spa

Cookie cookie = new Cookie("username","zhangsan");

那麼該cookie會以響應頭的形式發送給客戶端:

注意:Cookie中不能存儲中文

2)設置Cookie在客戶端的持久化時間:

cookie.setMaxAge(int seconds); ---時間秒

注意:若是不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉cookie信息銷燬(會話級別的cookie),

若是設置持久化時間,cookie信息會被持久化到瀏覽器的磁盤文件裏

示例:

cookie.setMaxAge(10*60);

設置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘,過時瀏覽器自動刪除該cookie信息

3)設置Cookie的攜帶路徑:

cookie.setPath(String path);

注意:若是不設置攜帶路徑,那麼該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息

如:"/WEB16/cookieServlet"->/WEB16

示例:

cookie.setPath("/WEB16");

表明訪問WEB16應用中的任何資源都攜帶cookie

cookie.setPath("/WEB16/cookieServlet");

表明訪問WEB16中的cookieServlet時才攜帶cookie信息

4)向客戶端發送cookie:

response.addCookie(Cookie cookie);

5)刪除客戶端的cookie:

若是想刪除客戶端的已經存儲的cookie信息,那麼就使用同名同路徑的持久化時間爲0的cookie進行覆蓋便可

服務器端怎麼接受客戶端攜帶的Cookie

cookie信息是以請求頭的方式發送到服務器端的:

 

1)經過request得到全部的Cookie:

Cookie[] cookies = request.getCookies();

2)遍歷Cookie數組,經過Cookie的名稱得到咱們想要的Cookie

for(Cookie cookie : cookies){

  if(cookie.getName().equal(cookieName)){

    String cookieValue = cookie.getValue();

  }

}

Session技術

Session技術是將數據存儲在服務器端的技術,會爲每一個客戶端都建立一塊內存空間存儲客戶的數據,但客戶端須要每次都攜帶一個標識ID去服務器中尋找屬於本身的內 存空間。因此說Session的實現是基於Cookie,Session須要藉助於Cookie存儲客戶的惟一性標識JSESSIONID

 

在Session這咱們須要學習以下三個問題:

怎樣得到屬於本客戶端的session對象(內存區域)?

怎樣向session中存取數據(session也是一個域對象)?

session對象的生命週期?

得到Session對象

HttpSession session = request.getSession();

此方法會得到專屬於當前會話的Session對象,若是服務器端沒有該會話的Session對象會建立一個新的Session返回,

若是已經有了屬於該會話的Session直接將已有的Session返回(實質就是根據JSESSIONID判斷該客戶端是否在服務器上已經存在session了)

複製代碼
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

     //建立屬於該客戶端(會話)的私有的session區域

   // request.getSession()方法內部會判斷 該客戶端是否在服務器端已經存在session

   // 若是該客戶端在此服務器不存在session 那麼就會建立一個新的session對象

    // 若是該客戶端在此服務器已經存在session 那麼就得到已經存在的該session返回

     HttpSession session=request.getSession();

     String id=session.getId();//該session對象的編號id

     response.getWriter().write("JESSIONID:"+id);

   }
複製代碼

怎樣向session中存取數據(session也是一個域對象)

Session也是存儲數據的區域對象,因此session對象也具備以下三個方法:

  ①session.setAttribute(String name,Object obj);

  ②session.getAttribute(String name);

  ③session.removeAttribute(String name);

Session對象的生命週期

建立:第一次執行request.getSession()時建立

銷燬:

1)服務器(非正常)關閉時

2)session過時/失效(默認30分鐘)

 

問題:時間的起算點 從什麼時候開始計算30分鐘?

從不操做服務器端的資源開始計時

能夠在工程的web.xml中進行配置

<session-config>

        <session-timeout>30</session-timeout>

</session-config>

3)手動銷燬session

session.invalidate();

 

做用範圍:

默認在一次會話中,也就是說在,一次會話中任何資源公用一個session對象

相關文章
相關標籤/搜索