1. 程式人生 > >會話管理——cookie和session技術

會話管理——cookie和session技術

存在 span str jsession 代碼 tco 2.3 cin cell

1 Cookie技術

1.1 Cookie技術特點:

會話數據保存瀏覽器客戶端

1.2 CookieAPI

Cookie類: 保存會話數據

1)創建Cookie對象,用於保存會話數據

new Cookie(java.lang.String name, java.lang.String value)

2)設置Cookie對象

void setPath(java.lang.String uri) 設置cookie有效路徑

void setMaxAge(int expiry) 設置cookie的有效時長

void setValue(java.lang.String newValue) 設置

cookie的值

3)發送Cookie數據到瀏覽器保存

response.addCookie(cookie);

4)接收瀏覽器發送的Cookie數據

Cookie[] request.getCookies()

1.3 Cookie的原理

1)服務器端創建Cookie數據,然後通過set-cookie的響應頭把cookie數據發送給瀏覽器保存

響應頭: 例如: set-cookie: name=eric

2)瀏覽器得到服務器發送cookie數據,保存在瀏覽器目錄中。

3)瀏覽器在下次訪問服務器時,會帶著cookie數據訪問服務器。通過cookie的請求頭把cookie數據發送給服務器端

請求頭: 例如 cookie: name=eric

4)服務器可以接受瀏覽器發送的cookie數據

request.getCookies();

1.4 Cookie的細節

1)設置cookie有效路徑: setPath(uri) 。如果cookie在有效路徑下,那麽瀏覽器在下次訪問該有效 路徑時就會帶著cookie數據到服務器。

什麽是有效路徑? 如果把該cookie設置到某個有效路徑下,然後當瀏覽器訪問這個有效路徑的時候,才會攜帶這個cookie數據給服務器。

2)設置cookie的有效時長: setMaxAge(整數)

正整數: cookie數據保存在瀏覽器的緩存目錄中(硬盤中)。例如

1010秒之後就cookie 就會丟失。(從最後一次訪問cookie開始計算)

負整數: cookie數據保存在瀏覽器的內存中,瀏覽器關閉cookie數據就會丟失。

零: 刪除同名的cookie

3可以同時往瀏覽器發送多個cookie數據,必須是字符串類型的。瀏覽器一般只允許存放300Cookie,每個站點最多存放20Cookie,每個Cookie的大小限制為4KB

2.5 案例

顯示用戶上次訪問時間

顯示最近瀏覽過的商品

1)創建Cookie對象,保存會話數據

如果要發送中文,必須先使用URLEncoder進行加密

2)設置有效路徑。默認情況下,設置當前項目的根目錄下

c.setPath("/day11");

3)設置有效時間

4)cookie發送給瀏覽器.通過響應頭攜帶cookie數據給瀏覽器(set-cookie)

response.setHeader("set-cookie", "name=jacky");

簡化版本

response.addCookie(c);

5)瀏覽器在下次訪問的時候攜帶了cookie數據,通過請求頭發送給服務器(cookie

6)服務器獲取瀏覽器發送的cookie數據

String name = request.getHeader("cookie");

簡化版本

request.getCookies()

總結:

cookie特點:

1)會話數據保存在客戶端

2)會話數據只能是字符串類型,不能保存中文的

3)會話數據容量有限制,一個cookie不能超過4kb,一個站點20cookie

4)不適合存在敏感數據

cookie技術有一定限制,所以要使用其他技術補充,來保存這些會話數據

2 Session技術

2.1Session特點

Session的會話數據保存服務器端(服務器端的內存中)

2.2 SessionAPI

HttpSession接口

1)創建或得到Session對象

HttpSession getSession()

HttpSession getSession(boolean create)

2session對象操作會話數據(域對象)

void setAttribute(java.lang.String name, java.lang.Object value) 保存數據

java.lang.Object getAttribute(java.lang.String name) 得到數據

void removeAttribute(java.lang.String name) 清除數據

3)設置session對象

void setMaxInactiveInterval(int interval) 設置session有效時長

java.lang.String getId() 得到session對象編號

void invalidate() 銷毀session對象

2.3Session原理

1)服務器創建Session對象,分配一個唯一的標記(JSESSIONID),會話數據保存sessino對象中,然後服務器把JSESSIONID作為cookie發送給瀏覽器保存

響應頭: JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E

2)瀏覽器得到JSESSIONIDcookie,保存在瀏覽器的目錄中

3)瀏覽器在下次訪問服務器時,帶著JSESSIONIDcookie數據訪問服務器。

請求頭:Cookie: JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E

4)服務器得到JSESSIONID,在服務器內存中查詢是否存在對應的編號的session對象。

5)如果找到對應的session對象,返回這個對象

6)如果找不到對應的session對象,有可能返回null,也有可能是創建新的session對象。

核心方法:HttpSession session = request.getSession();

偽代碼:

1)創建session對象

Session session1 = new Session();

Cookie cookie = new Cookie("JSESSIONID","001") //註意默認保存在瀏覽器內存

response.addCookie(cookie);

2)得到session對象

在服務器查詢對應JSESSIONIDsession對象,返回session對象

結論: 瀏覽器通過JSESSIONIDsession編號)在服務器中查詢session對象

2.4 Session細節

1)得到session對象編號: getId() 得到JSESSIONcookie值。

2)設置session有效時長:

註意: 關閉瀏覽器不會導致session對象銷毀!!

A 默認時間: 30分鐘後,服務器自動回收session對象。(最後一次訪問session開始計算)

B 代碼設置session的有效時長:

void setMaxInactiveInterval(int interval) 以秒為單位

C 全局設置session的有效時長:

web.xml文件中,設置

<!-- 配置session的有效時<session-config>

<session-timeo長:以分為單位 -->

ut>1</session-timeout>

</session-config>

D 立即手動銷毀session對象:invalidate()

3request.getSession()方法

HttpSession getSession()/getSession(true) 創建或得到session對象。當前沒有找到對應的session 對象,創建新的session對象

HttpSession getSession(false) 得到session對象。如果找不到,則返回null

4)默認情況下,JSESSSOINcookie保存在瀏覽器內存,如果要保存到硬盤。

Cookie cookie = new Cookie("JSESSIONID",session.getId());

cookie.setMaxAge(100000);

response.addCookie(cookie);

2.5案例

用戶登錄

會話管理——cookie和session技術