這篇文章主要介紹如何使用HTTP會話,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
最佳實踐: 請瀏覽有關實現 HTTP 會話的建議。
為保護 HTTP 會話啟用安全性集成
HTTP 會話由會話標識來識別。會話標識是在運行時生成的一個偽隨機數。會話 hijacking 是一個已知攻擊 HTTP 會話,當通過網絡的所有請求被強制通過安全連接(意味著 HTTPS)時它可被阻止。但并不是每個客戶環境中的配置都強制此約束,這是因為 SSL 連接的性能影響。由于這個緩和方式,HTTP 會話易受 hijacking 的攻擊,并且因為這個弱點 WebSphere Application Server 有一個選項以緊密結合 HTTP 會話和 WebSphere Application Server 安全性。在 WebSphere Application Server 中啟用安全性,以使會話以僅允許創建這些會話的用戶訪問它們的方式來進行保護。
完成后使用 javax.servlet.http.HttpSession.invalidate() 釋放 HttpSession 對象。
HttpSession 對象在 Web 容器中存活到:
應用程序使用 javax.servlet.http.HttpSession.invalidate 方法明確地、程序化地釋放它;頻繁、程序化的無效是應用程序注銷功能的一部分。
HttpSession 到期時(缺省 = 1800 秒或 30 分鐘),WebSphere Application Server 銷毀已分配的 HttpSession?;跁捁芾碓O置,WebSphere Application Server 在內存中僅可以維持一定數量的 HTTP 會話。在分布式會話的情況下,當內存中達到最大高速緩存限制時,會話管理工具把最近最少使用(LRU)的一個會話從高速緩存中除去,為會話騰出空間。
避免嘗試保存和重新使用每個 servlet 或 JSP 文件外的 HttpSession 對象。
HttpSession 對象是 HttpRequest(您可以僅通過 req.getSession 方法獲取它)的功能,其副本僅在 servlet 或 JSP 文件的 service 方法的生存期有效。您無法高速緩存 HttpSession 對象和在 servlet 或 JSP 文件的范圍外引用它。
當開發要在 HTTP 會話中存儲的新對象時,實現 java.io.Serializable 接口。
類的可串行性由實現 java.io.Serializable 接口的類啟用。實現 ava.io.Serializable 接口允許在使用分布式會話時正確序列化對象。未實現此接口的類不會將它們的狀態序列化或取消序列化。因此,如果類未實現 Serializable 接口,則 JVM 無法將該類的狀態保持到數據庫或另一個 JVM 中??尚蛄谢惖乃凶宇愋投际强尚蛄谢?。示例如下:
[object Object][object Object]
確保未標記為瞬態的所有實例變量對象是可序列化的。不能高速緩存不可序列化的對象。
為了符合 Java Servlet 規范,當分布式 servlet 容器無法支持遷移存儲對象的會話所需要的機制時,該容器必須為這些對象創建 IllegalArgumentException。僅當選擇了 distributable 時才會創建異常。
HTTPSession API 不發布會話的事務行為。
分布式 HTTPSession 支持不保證在故障轉移方案中或會話親緣關系中斷時屬性的事務完整性。使用事務感知的資源(象 Enterprise Java Beans)來保證應用程序所要求的事務完整性。
確保您添加到會話的 Java 對象在正確的類路徑中。
如果您把 Java 對象添加到會話,則把那些對象的類文件放入正確的類路徑中(如果在企業應用程序中利用跨 Web 模塊的共享,則使用應用程序類路徑,或者如果使用 Servlet 2.2 兼容的會話共享,則使用 Web 模塊類路徑)或者放入包括在 WebSphere Application Server 中使用的其他 servlet 的目錄下。在會話集群的情況下,此操作應用到此集群中的每個節點。
由于 HttpSession 對象在用戶可能訪問的 servlet 之間是共享的,所以考慮采用站點范圍的命名約定,以避免沖突。
避免在 HttpSession 對象中存儲大對象圖。
在大多數應用程序中,每個 servlet 只需要全部會話數據的一小部分。然而,通過將數據作為一個大對象存儲在 HttpSession 對象中,應用程序迫使 WebSphere Application Server 每次都處理所有數據。
利用會話親緣關系幫助您獲取在 WebSphere Application Server 中的較高的高速緩存命中率。
WebSphere Application Server 具有幫助會話親緣關系的 HTTP Server 插件中的功能性。插件會從瀏覽器中讀取 cookie 數據(或已編碼的 URL),并且幫助把請求導向到適當的應用程序或克?。ɑ谝阎付ǖ臅捗荑€)。此功能增加了內存中的高速緩存的使用,并且減少對數據庫或另一個 WebSphere Application Server 實例的命中。
會話親緣關系的最大化使用和避免中斷親緣關系。
正確使用會話親緣關系可以增強 WebSphere Application Server 的性能。WebSphere Application Server 環境中的會話親緣關系是一種最大化地使用會話對象的內存中高速緩存,并減少讀數據庫或另一個 WebSphere Application Server 實例數的方法。會話親緣關系通過高速緩存應用程序(用戶正在與其進行交互)的服務器實例中的會話對象進行工作。如果應用程序部署在服務器組的多臺服務器中,則應用程序可以把用戶導向到其中任何一臺服務器。如果用戶在 server1 開始, 然后過一會進入到 server2,則服務器必須把所有會話信息寫到外部位置,以便服務器實例(server2 正在其中運行)可以讀取該數據庫??梢允褂脮捰H緣關系避免數據庫讀。使用會話親緣關系,用戶將為第一個請求在 server1 上啟動;然后,對于每個后續的請求,用戶將被導向回 server1。Server1 必須僅查看高速緩存以獲取會話信息;server1 從不需要調用會話數據庫以獲取該信息。
您可以通過不中斷會話親緣關系改進性能。幫助您避免中斷會話親緣關系的一些建議是:
如果可能,把所有 Web 應用程序組合到單應用程序服務器實例,并使用模型或克隆來提供故障轉移支持。
使用多框架 JSP 文件時,為框架頁面創建會話,但是不為框架中的頁面創建會話。(請參閱此主題中的后續討論。)
使用多框架頁面時,遵循以下準則:
僅在一個框架中或訪問任何框架集之前創建會話。例如,假設不存在已與瀏覽器相關聯的會話,并且用戶訪問多框架 JSP 文件,瀏覽器發出 JSP 文件的并發請求。因為請求不是任何會話的部分,因此 JSP 文件結束創建多個會話,并且所有 cookie 都發回到該瀏覽器。該瀏覽器僅執行到達的最后 cookie。因此,僅客戶機可以檢索與最后一個 cookie 相關聯的會話。建議您在訪問利用 JSP 文件的多框架頁面前創建會話。
缺省情況下,JSP 文件使用 request.getSession(true) 方法獲取 HTTPSession。因此缺省情況下,如果不存在用于客戶機的會話,則 JSP 文件會創建新會話。瀏覽器中的每個 JSP 頁面正在請求一個新會話,但是,只有一個會話用于每個瀏覽器實例。開發者可以使用
<% page="" session="false"> 關閉不訪問此會話的 JSP 文件中的自動會話創建。接著,如果頁面需要訪問該會話信息,開發者可以使用 <%httpsession session="javax.servlet.http.HttpServletRequest.getSession(false);"> 以獲取由原始會話創建 JSP 文件所創建的已存在的會話。此操作幫助您防止中斷框架頁面的初始裝入上的會話親緣關系。
僅使用一個框架更新會話數據。使用框架集時,請求并發地進入 HTTP 服務器。僅在一個框架中修改會話數據,以便會話更改不被所建議的并發框架集中的會話更改覆蓋。
避免使用多框架 JSP 文件,其中框架指向不同的 Web 應用程序。此操作導致丟失另一個 Web 應用程序創建的會話,因為來自第一個 Web 應用程序的 JSESSIONID cookie 是由第二個 Web 應用程序創建的 JSESSIONID 所覆蓋。
當把安全性應用到 servlet 或 JSP 文件(使用帶有啟用的安全性集成的會話)時,保護所有頁面(不只是某些頁面)。
當它應用到安全性和會話時,它保護所有頁面或什么也不保護。因此,對于部分時間要保護會話狀態的訪問來說它是沒有意義的。當在會話管理工具中啟用安全性集成時,創建或訪問會話的所有資源必須是受保護的或未受保護的。您不能混合受保護的和未受保護的資源。
僅保護幾個頁面的問題是,在受保護的頁面中創建的會話是用已認證用戶的標識創建的。僅同一用戶能夠訪問其他受保護的頁面中的會話。要保護這些會話不被未授權的用戶使用,不能從未受保護的頁面訪問它們。當發生來自未受保護的頁面的請求時,拒絕訪問并且創建 UnauthorizedSessionRequestException 錯誤。(UnauthorizedSessionRequestException 是運行時異常;它是為您記錄的。)
使用手工更新和 sync() 方法或基于時間的寫應用程序(讀取會話數據),但更新很少。
寫頻率時使用 END_OF_SERVICE,當應用程序使用會話并且任何時候數據從該會話讀出或寫入時,LastAccess 時間字段會更新。如果使用數據庫會話,則產生對數據庫的新的寫。此活動是性能命中,僅當數據值更新時(不是每個記錄的讀或寫),您可以避免使用“手工更新”選項并且使記錄寫回數據庫。
要使用手工更新,請在會話管理服務中打開它。另外,應用程序代碼必須使用 com.ibm.websphere.servlet.session.IBMSession 類來代替一般的 HttpSession。在 IBMSession 對象中,存在 sync 方法。此方法告訴 WebSphere Application Server 把會話對象中的數據寫到數據庫。此活動幫助開發者通過僅在必要時存留會話信息來提高整個性能。
注: 使用手工更新的替代方法是利用時間更新以在不同的時間間隔中保持數據。此操作提供類似手工更新方案的結果。
實現以下各建議以達到高性能:
如果應用程序不頻繁更改會話數據,則使用手工更新和 sync 函數(或定時更新)有效地存留會話信息。
盡可能小地保持會話中存儲的數據量。簡單地使用會話來保持數據,因為有時在會話對象中會存儲太多的數據。確定數據存儲和性能之間的正確平衡以有效地使用會話。
如果使用數據庫會話,則為會話數據庫使用專用數據庫。避免使用應用程序數據庫。這能夠幫助您避免爭用 JDBC 連接并允許使用更好的數據庫性能。
如果使用內存到內存會話,則將分區(組或單個副本)作為您的集群使用會增加大小并縮小減少。
驗證您是否具有 WebSphere Application Server 的最新修訂包。
利用以下各工具幫助監視會話性能。
運行 com.ibm.servlet.personalization.sessiontracking.IBMTrackerDebug servlet。- 要運行此 servlet,必須運行要在 Web 應用程序中運行的 servlet 調用程序?;蛘?,您可以明確地在要運行的應用程序中配置此 servlet。
使用與 WebSphere Application Server 一起提供的 WebSphere Application Server 資源分析器,監視 WebSphere Application Server 環境的活動會話和統計信息。
使用數據庫跟蹤工具,如 DB2 中的“Monitoring”。
以上是“如何使用HTTP會話”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。