Posted on 2015-09-28 10:17
FineReport——報表技術領跑者 閱讀(93)
評論(0) 編輯 收藏
1. 報表session與應用session
報表集成到項目中可能會有一個疑問就是系統應用和報表應用在一個web服務器下,那系統session和報表session是不是一個session呢?如果不是那會不會有沖突呢?
答案是:不是同一個session也不會起沖突,因為應用的session存放的是request請求等一些共享信息,而報表session存放的是訪問報表的相關信息,如訪問的是不是同一個模板等,兩者是完全獨立,所以不會沖突。
2. 報表開發工具FineReport中創建與關閉session機制
正常情況下,當客戶端瀏覽器訪問報表服務器端的某張報表時,便會產生一個session會話,當用戶關閉瀏覽器的時候就會通知報表服務器關閉這個session,但不會使保存在服務器端的session對象消失,同樣也不會使已經保存到硬盤上的持久化cookie消失。
若用戶的機器由于某種原因如非正常關機等等導致瀏覽器非正常關閉時,服務器沒有收到關閉這個session的信息,會一直保存這個不必要的session。為了解決這個問題,我們軟件中提供了這樣一種機制,瀏覽器每隔40秒向服務器發送一個“i am alive”信息,若報表服務器一分鐘沒有收到這個信息便會自動關閉這個session。當瀏覽器遇到非正常停止時,便不會發送“i am alive”信息,相應的session不會在一分鐘以內被關閉。
3. 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在下列情況下被刪除:
a、程序調用HttpSession.invalidate() b、距離上一次收到客戶端發送的session id時間間隔超過了session的最大有效時間 c、服務器進程被停止
3.3 如何做到在瀏覽器關閉時刪除session
嚴格的講,做不到這一點。可以做一點努力的辦法是在所有的客戶端頁面里使用javascript代碼window.oncolose來監視瀏覽器的關閉動作,然后向服務器發送一個請求來刪除session。但是對于瀏覽器崩潰或者強行殺死進程這些非常規手段仍然無能為力。