http無狀態協定的解決:
HTTP 是一種無狀態協定。無狀態協定不要求伺服器在多次請求期間保留有關每個使用者的資訊或狀態。
但是某些 Web 應用程式可能必須追蹤使用者從一個頁面到另一個頁面的進度,例如,當需要 Web 伺服器為使用者自訂網頁內容時。這些情況的解決方案包括:
HTTP cookie 的使用。
伺服器端會話。
隱藏變數(當前頁麵包含表單時)
#使用URI 編碼參數的URL 重寫,例如,/index.php? session_id=some_unique_session_code。
使協定無狀態的原因是伺服器不需要追蹤多個請求的狀態,而不是它如果願意就不能這樣做。這簡化了客戶端和伺服器之間的合同,並且在許多情況下(例如透過 CDN 提供靜態資料)最大限度地減少了需要傳輸的資料量。如果要求伺服器維護用戶端存取的狀態,則發出和回應請求的結構將更加複雜。事實上,模型的簡單性是其最大的特點之一。
cookie是一種在伺服器中建立並維護,但儲存在瀏覽器端的會話技術
cookie的應用程式場景:記住使用者名稱和密碼、七天免登陸
//创建cookie Cookie cookie = new Cookie("username", "admin"); //将cookie响应到浏览器 response.addCookie(cookie);
cookie在訊息中的表示方式:
若在伺服器中建立cookie,並回應到瀏覽器,此時在回應訊息中會出現:Set-Cookie: username=admin
此後,每次瀏覽器向伺服器發送請求,都會攜帶此cookie,在請求訊息中會出現:Cookie: username=admin
把cookie回應到瀏覽器之後,會保存在瀏覽器的運行記憶體中,當瀏覽器關閉時,瀏覽器的運行記憶體會被釋放,因此cookie會被清空。因此會話預設的有效時間是瀏覽器開啟到瀏覽器關閉
//获取浏览器发送请求所携带的所有cookie Cookie[] cookies = request.getCookies(); if(cookies != null){ for (Cookie cookie : cookies) { System.out.println(cookie.getName() + "," + cookie.getValue()); } }
a>因為cookie是鍵值對格式的數據,因此只需要創建相同的鍵不同的值的cookie,響應瀏覽器,就會將相對應的cookie的值進行覆蓋
b>使用cookie.setValue()
/*Cookie cookie = new Cookie("username", "root"); response.addCookie(cookie);*/ Cookie[] cookies = request.getCookies(); if(cookies != null){ for (Cookie cookie : cookies) { if(cookie.getName().equals("username")){ cookie.setValue("zhangsan"); response.addCookie(cookie); } } }
把cookie回應到瀏覽器之後,會保存在瀏覽器的運行記憶體中,當瀏覽器關閉時,瀏覽器的運行記憶體會被釋放,因此cookie會被清空。因此會話預設的有效時間就是瀏覽器開啟到瀏覽器關閉
但是可以透過cookie.setMaxAge()設定cookie的有效時間
a>當設定的有效時間為負整數時,沒有任何效果,即有效時間為瀏覽器開啟到瀏覽器關閉
b>當設定的有效時間為0時,表示立即刪除該cookie
c>當設定的有效時間為正整數時
若有效時間小於一次會話,cookie到了指定時間,就會自動從運行記憶體中刪除
若有效時間大於一次會話,當瀏覽器關閉,會將cookie中的資料儲存到磁碟中,當瀏覽器再次開啟時,會將磁碟中的資料重新載入到執行記憶體中
cookie. setPath();
當建立了cookie,並回應到瀏覽器之後,設定了有效路徑的cookie,只有在存取指定路徑時才會攜帶該cookie
session是一種在伺服器中建立並維護並保存在伺服器端的會話技術
session的應用程式場景:記錄使用者的登入狀態
透過request.getSession()取得session物件
當此次會話中第一次造訪request.getSession( )取得session物件時,回應封包中會出一個鍵為JSESSIONID的cookie
之後每次透過瀏覽器傳送請求到伺服器,都會攜帶此JSESSIONID的cookie
#就算訪問伺服器時,使用的request.getSession()再次取得session對象,只要請求訊息中有JSESSIONID的cookie,回應訊息中就不會再出現此cookie
問:
session的原理?
session和cookie的關係?
為什麼在一次會話中,取得的session都是同一個?
答:
當透過request.getSession()取得session時,會取得請求封包中鍵為JSESSIONID的cookie
若請求封包中沒有鍵為JSESSIONID的cookie,此時表示目前的會話剛剛開始,是目前會話中第一次取得session物件。此時在伺服器內部會建立session對象,並且會建立一個cookie,鍵為JSESSIONID,值為UUID隨機序列;然後會將建立session物件儲存到一個由伺服器所維護的map集合中,以UUID隨機序列為鍵,以session物件為值,最終將JSESSIONID的cookie回應到瀏覽器
若请求报文中存在键为JSESSIONID的cookie,此时获取该cookie的值,即UUID随机序列,以UUID随机序列为键,从服务器所维护的map集合中就可以获取唯一的session对象
void setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
session的时效指在指定时间内,若没有对session进行任何的操作,此时session会自动失效
a>通过web.xml设置,单位是分钟
<session-config> <session-timeout>30</session-timeout> </session-config>
b>通过session.setMaxInactiveInterval()设置,单位是秒
session.setMaxInactiveInterval(1800);
session.invalidate()
session的钝化指服务器关闭,但是浏览器没有关闭,此时session中的数据会被序列化到磁盘上
session的活化指服务器启动,并且浏览器仍然没有关闭,此时会将序列化到磁盘上的数据重新加载到内存中
注意:若session中存储的是实体类对象,此时若要钝化,则该实体类和该实体类的成员变量也都要实现序列化的接口
1、cookie存储在浏览器端,session存储在服务器端,因此cookie相对而言不安全
2、cookie只能存储字符串类型的键值对,session可以存储任意类型的数据,因此若存储相同的数据,cookie可能会产生大量的cookie
3、由于每次浏览器发送请求都会携带cookie,若有大量的cookie,就会造成网络负担
以上是如何在Java中使用cookie和session會話技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!