重定向地址_JavaWeb - Servlet:重定向和转发,状态管理
Servlet + JDBC 應用
在 Servlet 中可以使用 JDBC 技術訪問數據庫,常見功能如下:
- 查詢 DB 數據,然后生成顯示頁面,例如:列表顯示功能。
- 接收請求參數,然后對 DB 操作,例如:注冊、登錄、修改密碼等功能。
為了方便重用和便于維護等目的,經常會采用 DAO(Data Access Object)模式對數據庫操作進行獨立封裝。
DAO 工廠(工廠模式):工廠類封裝了對象的創建細節,為調用者提供符合要求的對象。
重定向和轉發
重定向的概述
概念
首先客戶瀏覽器發送 http 請求,當 web 服務器接受后發送 302 狀態碼響應及對應新的 location 給客戶瀏覽器,客戶瀏覽器發現是 302 響應,則自動再發送一個新的 http 請求,請求 url 是新的 location 地址,服務器根據此請求尋找資源并發送給客戶。
實現
實現重定向需要借助 javax.servlet.http.HttpServletResponse 接口中的方法:
void sendRedirect(String location) 使用指定的重定向位置 URL 向客戶端發送臨時重定向響應
原理
當執行添加頁面功能時,瀏覽器發送 add.do 請求給 Tomcat 服務器;
Tomcat 服務器的 AddServlet 收到 add.do 請求后,先訪問數據庫 DB 執行插入新數據的操作,然后發送 302 狀態碼及重定向的新地址 Location: list.do 信息到瀏覽器;
瀏覽器根據新地址發送 list.do 請求給 Tomcat 服務器;
Tomcat 服務器的 ListServlet 收到 list.do 請求后,先訪問數據庫 DB 獲取 list 數據,然后發送 200 狀態碼及 list 數據到瀏覽器;
瀏覽器根據 list 數據展示頁面。
特點
重定向之后,瀏覽器地址欄的 URL 會發生改變。
重定向過程中會將前面 Request 對象銷毀,然后創建一個新的 Request 對象。
重定向的 URL 可以是其它項目工程。
轉發的概述
轉發的概念
一個 Web 組件(Servlet/JSP)將未完成的處理通過容器轉交給另外一個 Web 組件繼續處理,轉發的各個組件會共享 Request 和 Response 對象。
轉發的實現
- 綁定數據到 Request 對象
Object getAttribute(String name) 將指定屬性值作為對象返回,若給定名稱屬性不存在,則返回空值
void setAttribute(String name,Object o) 在此請求中存儲屬性值
- 獲取轉發器對象
RequestDispatcher getRequestDispatcher(String path) 返回一個 RequestDispatcher 對象,該對象充當位于給定路徑上的資源的包裝器
- 轉發操作
void forward(ServletRequest request, ServletResponse response) 將請求從一個 servlet 轉發到服務器上的另一個資源(Servlet、JSP文件或HTML文件)
轉發的特點
轉發之后瀏覽器地址欄的 URL 不會發生改變。
轉發過程中共享 Request 對象。
轉發的 URL 不可以是其它項目工程。
重定向和轉發的比較
Servlet 線程安全
服務器在收到請求之后,會啟動一個線程來進行相應的請求處理。
默認情況下,服務器為每個 Servlet 只創建一個對象實例。當多個請求訪問同一個 Servlet 時,會有多個線程訪問同一個 Servlet 對象,此時就可能發生線程安全問題。
多線程并發邏輯,需要使用 synchronized 對代碼加鎖處理,但盡量避免使用。
狀態管理
Web 程序基于 HTTP 協議通信,而 HTTP 協議是”無狀態”的協議,一旦服務器響應完客戶的請求之后,就斷開連接,而同一個客戶的下一次請求又會重新建立網絡連接。
服務器程序有時是需要判斷是否為同一個客戶發出的請求,比如客戶的多次選購商品。因此,有必要跟蹤同一個客戶發出的一系列請求。
把瀏覽器與服務器之間多次交互作為一個整體,將多次交互所涉及的數據保存下來,即狀態管理。
多次交互的數據狀態可以在客戶端保存,也可以在服務器端保存。
狀態管理主要分為兩類:
- 客戶端管理 - 將狀態保存在客戶端?;?Cookie 技術實現。
- 服務器管理 - 將狀態保存在服務器端?;?Session 技術實現。
Cookie 技術
基本概念
Cookie 表示客戶端以“名-值”形式進行保存的一種技術。
瀏覽器向服務器發送請求時,服務器將數據以 Set-Cookie 消息頭的方式響應給瀏覽器,然后瀏覽器會將這些數據以文本文件的方式保存起來。
當瀏覽器再次訪問服務器時,會將這些數據以 Cookie 消息頭的方式發送給服務器。
相關的方法
- 使用 javax.servlet.http.Cookie 類的構造方法實現 Cookie 的創建。
Cookie(String name, String value) 根據參數指定數值構造對象
- 使用 javax.servlet.http.HttpServletResponse 接口的成員方法實現 Cookie 的添加。
void addCookie(Cookie cookie) 添加參數指定的對象到響應
- 使用 javax.servlet.http.HttpServletRequest 接口的成員方法實現 Cookie 對象的獲取。
Cookie[] getCookies() 返回此請求中包含的所有 Cookie 對象
- 使用 javax.servlet.http.Cookie 類的構造方法實現 Cookie 對象中屬性的獲取和修改。
String getName() 返回此 Cookie 對象中的名字
String getValue() 返回此 Cookie 對象的數值
void setValue(String newValue) 設置 Cookie 的數值
Cookie 的生命周期
- 默認情況下,瀏覽器會將 Cookie 信息保存在內存中,只要瀏覽器關閉,Cookie 信息就會消失。
- 如果希望關閉瀏覽器后 Cookie 信息仍有效,可以通過 Cookie 類的成員方法實現。
int getMaxAge() 返回cookie的最長使用期限(以秒為單位)
void setMaxAge(int expiry) 設置cookie的最長保留時間(秒)
Cookie 的路徑問題
- 瀏覽器在訪問服務器時,會比較 Cookie 的路徑與請求路徑是否匹配,只有匹配的 Cookie 才會發送給服務器。
- Cookie 的默認路徑等于添加這個 Cookie 信息時的組件路徑,例如:/項目名/目錄/add.do 請求添加了一個 Cookie 信息,則該 Cookie 的路徑是 /項目名/目錄。
- 訪問的請求地址必須符合 Cookie 的路徑或者其子路徑時,瀏覽器才會發送 Cookie 信息。如果訪問請求地址為 項目名/test.html,則路徑為 項目名 的 Cookie 信息會被發送到服務器;如果訪問請求地址為 項目名/目錄/test.html,則路徑為 項目名 和 項目名/目錄 的 Cookie 信息會被發送到服務器。
void setPath(String uri) 設置 Cookie 的路徑信息
Cookie 的特點
Cookie 技術不適合存儲所有數據,程序員只用于存儲少量、非敏感信息,原因如下:
- 將狀態數據保存在瀏覽器端,不安全
- 保存數據量有限制,大約 4 KB 左右
- 只能保存字符串信息
- 可以通過瀏覽器設置為禁止使用
Session 技術
基本概念
Session 是用來維護一個客戶端和服務器關聯的一種技術。
瀏覽器訪問服務器時,服務器會為每一個瀏覽器都在服務器端的內存中分配一個空間,用于創建一個 Session 對象,該對象有一個 id 屬性且該值唯一,我們稱為 SessionId,并且服務器會將這個 SessionId 以 Cookie 方式發送給瀏覽器存儲。
瀏覽器再次訪問服務器時會將 SessionId 發送給服務器,服務器可以依據 SessionId 查找相對應的 Session 對象。
相關的方法
- 使用 javax.servlet.http.HttpServletRequest 接口的成員方法實現 Session 的獲取。
HttpSession getSession() 返回此請求關聯的當前 Session,若此請求沒有則創建一個
- 使用 javax.servlet.http.HttpSession 接口的成員方法實現判斷和獲取。
boolean isNew() 判斷是否為新創建的 Session
String getId() 獲取 Session 的編號
- 使用 javax.servlet.http.HttpSession 接口的成員方法實現屬性的管理。
Object getAttribute(String name) 返回在此會話中用指定名稱綁定的對象,如果沒有對象在該名稱下綁定,則返回空值
void setAttribute(String name, Object value) 使用指定的名稱將對象綁定到此會話
void removeAttribute(String name) 從此會話中刪除與指定名稱綁定的對象
Session 的生命周期
- 為了節省服務器內存空間資源,服務器會將空閑時間過長的 Session 對象自動清除掉,服務器默認的超時限制一般是 30 分鐘。
- 使用 javax.servlet.http.HttpSession 接口的成員方法實現失效實現的獲取和設置。
int getMaxInactiveInterval() 獲取失效時間
void setMaxInactiveInterval(int interval) 設置失效時間
- 可以配置 web.xml 文件修改失效時間。
Session 的特點
數據比較安全。
能夠保存的數據類型豐富,而 Cookie 只能保存字符串。
能夠保存更多的數據,而 Cookie 大約保存 4 KB。
數據保存在服務器端會占用服務器的內存空間,如果存儲信息過多、用戶量過大,會嚴重影響服務器的性能。
想了解更多,歡迎關注我的微信公眾號:Renda_Zhang
總結
以上是生活随笔為你收集整理的重定向地址_JavaWeb - Servlet:重定向和转发,状态管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone清理喇叭灰尘_iphone正
- 下一篇: java volatile lock_J