Cookies & Session

套件發表於2015-03-19

1.兩者區別:

Cookie是客戶端技術
HttpSession是伺服器端技術

2.Cookies是什麼?

一個小資訊,由伺服器寫給瀏覽器的;
由瀏覽器來儲存;
客戶端儲存的Cookie資訊,可以再次帶給伺服器

3.Cookies的屬性:

name:必須的
value:必須的
comment:可選的。註釋
path:可選的。
    寫Cookie的程式的訪問路徑是:http://localhost:8080/day07/servlet/CookieDemo1
    其中:localhost就是域名;/day07/servlet就是當前Cookie的path
    如果一個Cookie的路徑設定成了/day07,意味著當前應用下的所有Cookies資源瀏覽器都會帶著它給伺服器。
    所以獲取和新增Path的保持一致,如:c.setPath(request.getContextPath());
domain:可選的。該Cookie所屬的網站域名。(itcast.cn)預設值。
maximum age:可選的。
    不設定就是會話過程(存在瀏覽器的記憶體中),單位是秒。
    如果是0,說明要刪除。
    如果是Integer.MAX_VALUE,說明永久儲存。
version:可選的。版本號

4.新增&獲取Cookies

例項化Cookies:Cookie c = new Cookie(名字,值);
向客戶端寫Cookie:c.addCookie();
得到客戶端傳來的Cookie:c.getCookies();
刪除cookie:c.setMaxAge(0);
記住cookie:c.setMaxAge(Integer.MAX_VALUE);

5.如何區分Cookies?

不能通過名稱,預設用domain+path+name來區分的。
最好固定用setPath(request.getContextPath());

6.URL地址寫法:

最好使用絕對路徑!"/"就代表著當前應用。
*地址給伺服器用的,不用加。
*給客戶端用的,要加,絕對路徑要加上應用名稱。

如:
        <link href=path/>                                要加/day07
        <script src=path/>                              要加/day07
        <img src=path/>                                 要加/day07
        <a href=path/>                                  要加/day07
        RequestDispatcher.include(path)                 不要加,"/"就代表著當前應用
        RequestDispatcher.forward(path)                 不要加,"/"就代表著當前應用
        HttpServletResponse.sendRedirect(path)          要加/day07
        ServletContext.getRealPath(path)                不要加,"/"就代表著當前應用

7.得到Session

Request.getSession():
*根據特殊Cookie(JSESSIONID=HttpSession物件的id,由伺服器生成,唯一的)的取值,在伺服器的記憶體中根據id查詢這個HttpSession物件,找到了,取出來繼續服務;
*沒有找到,建立一個新的HttpSession物件。

Request.getSession(boolean b):
如果b為true,與上面方法功能完全一致;
如果為false,只查詢。

8.Session的作用:

1.貫穿使用者登入到登出/關閉瀏覽器的整個過程;
2.識別使用者並保持使用者資訊,或者說監控使用者是否登入或者已經登出;
3.防止表單重複提交;(利用session儲存一個隨機的令牌,用一次就銷燬,看你怎麼重複提交表單)
這裡寫圖片描述
4.實現一次性驗證碼。(把驗證碼code放進session中,防止抓包對其破解)

9.禁用Cookie後的會話資料儲存問題

1.客戶端禁用Cookie對http://localhost訪問的無效。

2.把URL重寫,必須對網站中的所有URL地址都重寫。
效果:url—->url;JSESSIONID=123459789
HttpServletResponse.encodeURL(url):是一個智慧方法。判斷使用者是否禁用了Cookie,沒有禁用,則不重寫;禁用了就重寫。
實際上就是把JSESIONID加在url後面,在瀏覽器位址列可以看到。

3.網站主頁:為了更好訪問本網站,請不要禁用您的Cookie。

10.HttpSession物件的狀態及轉換(序列化)

1.更改記憶體中HttpSession物件的超時時間。
修改web.xml

<session-config>
<session-timeout>1</session-timeout><!--自然整數,單位是分鐘-->
</session-config>

2.實現session持久化。(必須在實現session的servlet 中實現介面implements serializable,不然報錯啊)
這裡寫圖片描述

相關文章