反饋已提交
網絡繁忙
Cookie 是儲存於存取者計算機的變數,每當同一臺計算機透過瀏覽器請求某個頁面時,就會傳送這個 Cookie。您可以使用 JavaScript 來建立和取回 Cookie 的值。
比如,當我們存取 sina 等郵箱時,會有一個選項提醒我們是否要儲存帳號和密碼,如果選是,我們的帳號和密碼就被儲存在了 Cookie 中。
我們可以透過 document 物件的 Cookie 屬性對當前文檔的 Cookie 進行讀取,建立,修改和刪除操作。
我們可以透過如下代碼傳回當前文檔的 Cookie:
document.write(document.cookie);
JSP 中我們可以建立一個可在 Cookie 變數中儲存存取者姓名的函式:
function setCookie(c_name,value,expiredays){var exdate=new Date()exdate.setDate(exdate.getDate() expiredays)document.cookie=c_name "=" escape(value) ((expiredays==null) ? "" : ";expires=" exdate.toGMTString())}
c_name 為姓名,value 為值,expiredays 為過期天數。
下面函式首先會檢查 document.cookie 物件中是否存有 Cookie。
假如 document.cookie 物件存有某些 Cookie,那麼會繼續檢查我們指定的 Cookie 是否已儲存。
如果找到了我們要的 Cookie,就傳回值,否則傳回空字串。
function getCookie(c_name){if (document.cookie.length>0) { c_start=document.cookie.indexOf(c_name "=") if (c_start!=-1) { c_start=c_start c_name.length 1 c_end=document.cookie.indexOf(";",c_start) if (c_end==-1) c_end=document.cookie.length return unescape(document.cookie.substring(c_start,c_end)) } }return ""}顯示代碼
function getCookie(c_name){if (document.cookie.length>0) { c_start=document.cookie.indexOf(c_name "=") if (c_start!=-1) { c_start=c_start c_name.length 1 c_end=document.cookie.indexOf(";",c_start) if (c_end==-1) c_end=document.cookie.length return unescape(document.cookie.substring(c_start,c_end)) } }return ""}
注:這裏指的是瀏覽器 Session
Session 機制本身並不複雜,然而其實現和配置上的靈活性卻使得具體情況複雜多變。這也要求我們不能把僅僅某一次的經驗或者某一個瀏覽器,伺服器的經驗當作普遍適用的經驗,而是始終需要具體情況具體分析。
通俗的說:用戶端瀏覽器存取某個位址,傳送了一個請求,就産生一個 Session 對話,現在的瀏覽器都可以開啟多個 Tab 視窗,開啟的都屬於一個 Session,當該瀏覽器關閉的時候 Session 就關閉了。若不關閉該瀏覽器,再次開啟一個瀏覽器,會重建立立一個 Session。
一個常見的誤解是以為 Session 在有用戶端存取時就被建立,然而事實是直到某 Server 端程式呼叫 HttpServletRequest.getSession(true)這樣的語句時才被建立,注意如果 JSP 沒有顯示的使用<%@page session="false"%>關閉 Session,則 JSP 檔案在編譯成 Servlet 時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true),這也是 JSP 中隱含的 Session 物件的來曆。
由於 Session 會消耗記憶體資源,因此,如果不打算使用 Session,應該在所有的 JSP 中關閉它。
綜合前面的討論,Session 在下列情況下被刪除:
程式呼叫 HttpSession.invalidate()
距離上一次收到用戶端傳送的 Session ID 時間間隔超過了 Session 的最大有效時間
伺服器進程被停止
嚴格的講,做不到這一點。可以做一點努力的辦法是在所有的用戶端頁面裏使用 JavaScript 代碼window.oncolose 來監視瀏覽器的關閉動作,然後向伺服器傳送一個請求來刪除 Session。但是對於瀏覽器當機或者強行殺死進程這些非標準手段仍然無能為力。
報表整合到項目中可能會有一個疑問就是系統應用和報表應用在一個 Web 伺服器下,那系統 Session 和報表 Session 是不是一個 Session 呢?如果不是那會不會有沖突呢?
答案是:不是同一個 Session 也不會起沖突,因為應用的 Session 存放的是 request 請求等一些共享資訊,而報表 Session 存放的是存取報表的相關資訊,如存取的是不是同一個範本等,兩者是完全獨立,所以不會沖突。
正常情況下,當用戶端瀏覽器存取報表伺服器端的某張報表時,便會産生一個 Session 對話,當使用者關閉瀏覽器的時候就會通知報表伺服器關閉這個 Session,但不會使儲存在伺服器端的 Session 物件消失,同樣也不會使已經儲存到硬碟上的持久化 Cookie 消失。
注:若到達 生命週期 後,會自動關閉相關 Session 。
具體來說 Cookie 機制採用的是在用戶端保持狀態的方案,而 Session 機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於伺服器端保持狀態的方案在用戶端也需要儲存一個標識,所以 Session 機制可能需要藉助於 Cookie 機制來達到儲存標識的目的,但實際上還有其他選擇。
對話的逾時由伺服器來維護,它不同於 Cookie 的失效日期。首先,對話一般基於駐留記憶體的 Cookie 不是持續性的 Cookie,因而也就沒有截至日期。即使截取到JSESSIONID Cookie,並為它設定一個失效日期傳送出去。瀏覽器對話和伺服器對話也會截然不同。當使用者關閉了瀏覽器雖然 Session、Cookie 已經消失,但不會使儲存在伺服器端的 Session 物件消失,同樣也不會使已經儲存到硬碟上的持久化 Cookie 消失。
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉
反馈已提交
网络繁忙