国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

Java 理論與實踐: Web 層的狀態(tài)復制

2019-11-18 14:41:51
字體:
來源:轉載
供稿:網(wǎng)友

  大多數(shù)具有一定重要性的 Web 應用程序都要求維護某種會話狀態(tài),如用戶購物車的內容。如何在群集服務器應用程序中治理和復制狀態(tài)對應用程序的可伸縮性有顯著影響。許多 J2SE 和 J2EE 應用程序將狀態(tài)存儲在由 Servlet API 提供的 Httpsession 中。本月,專欄作家 Brian Goetz 分析了狀態(tài)復制的一些選項以及如何最有效地使用 HttpSession 以提供好的伸縮性和性能。在本文論壇中與本文作者和其他讀者分享您的觀點。(可以單擊文章頂部或者底部的 討論 訪問論壇。)
不管正在構建的是 J2EE 還是 J2SE 服務器應用程序,都有可能以某種方式使用 java Servlet —— 可能是直接地通過像 jsp 技術、Velocity 或者 WebMacro 這樣的表示層,也可能通過一個基于 servlet 的 Web 服務實現(xiàn),如 Axis 或者 Glue。Servlet API 提供的一個最重要的功能是會話治理 —— 通過 HttpSession 接口進行用戶狀態(tài)的認證、失效和維護。

會話狀態(tài)
幾乎每一個 Web 應用程序都有一些會話狀態(tài),這些狀態(tài)有可能像記住您是否已登錄這么簡單,也可能是您的會話的更具體的歷史,如購物車的內容、以前查詢結果的緩存或者 20 頁動態(tài)問卷表的完整響應歷史。因為 HTTP 協(xié)議本身是無狀態(tài)的,所以需要將會話狀態(tài)存儲在某處并與瀏覽會話以某種方式相關聯(lián),使得下次請求同一 Web 應用程序的頁面時可以輕易地獲取。幸運的是,J2EE 提供了幾種治理會話狀態(tài)的方法 —— 狀態(tài)可以存儲在數(shù)據(jù)層,用 Servlet API 的 HttpSession 接口存儲在 Web 層,用有狀態(tài)會話 bean 存儲在 EnterPRise JavaBeans(EJB)層,甚至用 cookie 或者隱藏表單字段將狀態(tài)存儲在客戶層。不幸的是,會話狀態(tài)治理不當會帶來嚴重的性能問題。

假如應用程序能夠在 HttpSession 中存儲用戶狀態(tài),這種方法通常比其他方法更好。在客戶端用 HTTP cookie 或者隱藏表單字段存儲會話狀態(tài)有很大的安全風險 —— 它將應用程序的一部分內部內容暴露給了非受信任的客戶層。(一個早期的電子商務網(wǎng)站將購物車內容(包括價格)存儲在隱藏表單字段中,從而可以很輕易被非法利用,讓任何了解 Html 和 HTTP 的用戶可以以 0.01 美元購買任何商品。噢)此外,使用 cookie 或者隱藏表單字段很混亂,輕易出錯,并且脆弱(假如用戶禁止在瀏覽器中使用 cookie,那么基于 cookie 的方法就完全不能工作)。

在 J2EE 應用程序中存儲服務器端狀態(tài)的其他方法是使用有狀態(tài)會話 bean,或者在數(shù)據(jù)庫中存儲會話狀態(tài)。雖然有狀態(tài)會話 bean 在會話狀態(tài)治理方面有更大的靈活性,但是在可能的情況下,將會話狀態(tài)存儲在 Web 層仍然有好處。假如業(yè)務對象是無狀態(tài)的,那么通常可以僅僅添加更多 Web 服務器來擴展應用程序,而不用添加更多 Web 服務器和更多 EJB 容器, 這樣的成本一般要低一些并且輕易完成。使用 HttpSession 存儲會話狀態(tài)的另一個好處是 Servlet API 提供了一種會話失效時通知的輕易方法。在數(shù)據(jù)庫中存儲會話狀態(tài)的成本可能難以承受。

servlet 規(guī)范沒有要求 servlet 容器進行某種類型的會話復制或者持久性,但是它建議將狀態(tài)復制作為 servlet 首要 存在理由(raison d'etre) 的重要部分,并且它對作為進行會話復制的容器提出了一些要求。會話復制可以提供大量好處 —— 負載平衡、伸縮性、容錯和高可用性。相應地,大多數(shù) servlet 容器支持某種形式的 HttpSession 復制,但是復制的機制、配置和時間是由實現(xiàn)決定的。

HttpSession API
簡單地說,HttpSession 接口支持幾種方法,servlet、JSP 頁或者其他表示層組件可以用這些方法來跨多個 HTTP 請求維護會話信息。會話綁定到特定的用戶,但是在 Web 應用程序的所有 servlet 中共享 —— 不特定于某一個 servlet。一種考慮會話的有用方法是,會話像一個在會話期間存儲對象的 Map —— 可以用 setAttribute 按名字存儲會話屬性,并用 getAttribute 提取它們。HttpSession 接口還包含會話生存周期方法,如 invalidate() (它通知容器應丟棄會話)。清單 1 顯示 HttpSession 接口最常用的元素:

清單 1. HttpSession API

public interface HttpSession {
Object getAttribute(String s);
Enumeration getAttributeNames();
void setAttribute(String s, Object o);
void removeAttribute(String s);

boolean isNew();
void invalidate();
void setMaxInactiveInterval(int i);

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 沙洋县| 南宫市| 永兴县| 浦东新区| 长春市| 综艺| 东源县| 莒南县| 会理县| 阿拉善右旗| 拜泉县| 灌南县| 常熟市| 新宁县| 惠州市| 额敏县| 策勒县| 上栗县| 京山县| 高青县| 兴仁县| 武功县| 驻马店市| 木兰县| 静宁县| 朝阳县| 三台县| 阿巴嘎旗| 井研县| 松桃| 萝北县| 常德市| 青岛市| 吴川市| 台江县| 德清县| 青龙| 洪洞县| 临泽县| 铁力市| 北票市|