日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

重定向地址_JavaWeb - Servlet:重定向和转发,状态管理

發布時間:2025/3/12 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重定向地址_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 不可以是其它項目工程。

重定向和轉發的比較

  • 重定向訪問服務器兩次,轉發只訪問服務器一次。
  • 轉發頁面的 URL 不會改變,而重定向地址會改變。
  • 轉發只能轉發到自己的 web 應用內,重定向可以重定義到任意資源路徑。
  • 轉發過程中共享 request 對象;而重定向會產生一個新的 request,不能共享 request 域信息與請求參數。
  • 轉發相當于服務器內部方法調用,轉發后面的代碼仍然會執行;而重定向操作是方法執行完成之后才進行。
  • 無論是 RequestDispatcher.forward 方法,還是 HttpServletResponse.sendRedirect 方法,在調用它們之前,都不能有內容已經被實際輸出到了客戶端。如果緩沖區中已經有了一些內容,這些內容將被從緩沖區中移除。
  • 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 文件修改失效時間。
    30

    Session 的特點

    數據比較安全。

    能夠保存的數據類型豐富,而 Cookie 只能保存字符串。

    能夠保存更多的數據,而 Cookie 大約保存 4 KB。

    數據保存在服務器端會占用服務器的內存空間,如果存儲信息過多、用戶量過大,會嚴重影響服務器的性能。

    想了解更多,歡迎關注我的微信公眾號:Renda_Zhang

    總結

    以上是生活随笔為你收集整理的重定向地址_JavaWeb - Servlet:重定向和转发,状态管理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。