Web 應用程式不當使用 Session 的問題

開發 Web 網站, 不論是 ASP、JSP、PHP..., 多少都會用到 Session Object, 用來儲存一些使用者瀏覽過程中的資料。由於 Session 相當方便, 幾乎所有的資料物件都可以借放在 Session 裡, 常會看到"濫用" Session 的系統, 造成一些令人困擾的網站:

1. 多網頁相互干擾

   有時候我們會多開幾個不同的視窗, 來比較同網站中的不同資料, 例如: 理財、購物、新聞...等網站, 有時我們會發現某些網站在開多個視窗之後, 卻造成兩個網頁的內容交互錯置, 這就是錯把 Session 當作網頁間的資料交換的暫存區造成的, 因為不同的瀏覽器視窗如果共用 Process 記憶空間, 就會共用 Cookie, 以致於 Session 也會共用。

2. 在操作中資料遺失或是忽然被登出

   偶而, 在網頁操作到一半時, 會發現剛剛輸入的資料莫名其妙地不見了, 甚至突然變成登出的狀態, 重新登入之後, 剛剛做到一半的資料怎麼也找不到。這是因為程式把工作間的暫存資料與使用者登入狀態放進 Session 裡, 當伺服器因維護的理由重置(Reset), 或是 WebFarm 作容錯轉移, 卻沒有跟著把 Session 裡的資料一起回復。

3. 不同 Web 技術難以並存

   通常不同時期所建立的專案, 會採用不同的技術來開發, 較新的開發技術自然有其優勢, 但是舊的系統已經每天都在用了, 實在沒有道理把舊系統改用新技術重寫, 而沒有去增加新功能, 不同技術所建置的系統, 經常會並存在同一家公司裡, 但是這些系統間很難無縫地整合, 特別是 Session 裡所存的資料無法在新舊系統之間交流。

為了解決上述的問題, ASP.NET 提供了 State Server 的功能, 可以讓 Session 存到其他 Server (如: 資料庫) 裡, 也可以讓舊的 ASP 程式存取 State Server 裡的資料(請參考 MSDN https://msdn2.microsoft.com/en-us/library/aa479313.aspx )

但是畢竟這不是解決問題長久之道, 若是為了貪圖寫程式上的方便, 毫無節制地把 Session 當成資料 Cache 使用, 仍會造成上述的問題。