1. 報表 Session 與應用 Session
報表集成到項目中可能會有一個疑問就是系統應用和報表應用在一個 Web 服務器下,那系統 Session 和報表 Session 是不是一個 Session 呢?如果不是那會不會有沖突呢?
答案是:不是同一個 Session 也不會起沖突,因爲應用的 Session 存放的是 request 請求等一些共享信息,而報表 Session 存放的是訪問報表的相關信息,如訪問的是不是同一個模板等,兩者是完全獨立,所以不會沖突。
2. FineReport 中創建與關閉 Session 機制
正常情況下,當客戶端浏覽器訪問報表服務器端的某張報表時,便會産生一個 Session 會話,當用戶關閉浏覽器的時候就會通知報表服務器關閉這個 Session,但不會使保存在服務器端的 Session 對象消失,同樣也不會使已經保存到硬盤上的持久化 Cookie 消失。
注:若到達 生命周期 後,會自動關閉相關 Session 。
3. Session 基本概念
注:這裏指的是浏覽器 Session
Session 機制本身并不複雜,然而其實現和配置上的靈活性卻使得具體情況複雜多變。這也要求我們不能把僅僅某一次的經驗或者某一個浏覽器,服務器的經驗當作普遍适用的經驗,而是始終需要具體情況具體分析。
通俗的說:客戶端浏覽器訪問某個地址,發送了一個請求,就産生一個 Session 會話,現在的浏覽器都可以打開多個 Tab 窗口,打開的都屬於一個 Session,當該浏覽器關閉的時候 Session 就關閉了。若不關閉該浏覽器,再次打開一個浏覽器,會重新創建一個 Session。
3.1 Session 在何時被創建
一個常見的誤解是以爲 Session 在有客戶端訪問時就被創建,然而事實是直到某 Server 端程序調用 HttpServletRequest.getSession(true) 這樣的語句時才被創建,注意如果 JSP 沒有顯示的使用<%@page session="false"%>關閉 Session,則 JSP 文件在編譯成 Servlet 時将會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true),這也是 JSP 中隐含的 Session 對象的來曆。
由於 Session 會消耗内存資源,因此,如果不打算使用 Session,應該在所有的 JSP 中關閉它。
3.2 Session 何時被删除
綜合前面的讨論,Session 在下列情況下被删除:
程序調用 HttpSession.invalidate()
距離上一次收到客戶端發送的 Session ID 時間間隔超過了 Session 的最大有效時間
服務器進程被停止
3.3 如何做到在浏覽器關閉時删除 Session
嚴格的講,做不到這一點。可以做一點努力的辦法是在所有的客戶端頁面裏使用 JavaScript 代碼window.oncolose 來監視浏覽器的關閉動作,然後向服務器發送一個請求來删除 Session。但是對於浏覽器崩潰或者強行殺死進程這些非常規手段仍然無能爲力。