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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2025/3/12 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重定向地址_JavaWeb - Servlet:重定向和转发,状态管理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Servlet + JDBC 應(yīng)用

在 Servlet 中可以使用 JDBC 技術(shù)訪問數(shù)據(jù)庫,常見功能如下:

  • 查詢 DB 數(shù)據(jù),然后生成顯示頁面,例如:列表顯示功能。
  • 接收請求參數(shù),然后對 DB 操作,例如:注冊、登錄、修改密碼等功能。

為了方便重用和便于維護(hù)等目的,經(jīng)常會采用 DAO(Data Access Object)模式對數(shù)據(jù)庫操作進(jìn)行獨(dú)立封裝。

DAO 工廠(工廠模式):工廠類封裝了對象的創(chuàng)建細(xì)節(jié),為調(diào)用者提供符合要求的對象。

重定向和轉(zhuǎn)發(fā)

重定向的概述

概念

首先客戶瀏覽器發(fā)送 http 請求,當(dāng) web 服務(wù)器接受后發(fā)送 302 狀態(tài)碼響應(yīng)及對應(yīng)新的 location 給客戶瀏覽器,客戶瀏覽器發(fā)現(xiàn)是 302 響應(yīng),則自動再發(fā)送一個(gè)新的 http 請求,請求 url 是新的 location 地址,服務(wù)器根據(jù)此請求尋找資源并發(fā)送給客戶。

實(shí)現(xiàn)

實(shí)現(xiàn)重定向需要借助 javax.servlet.http.HttpServletResponse 接口中的方法:

void sendRedirect(String location) 使用指定的重定向位置 URL 向客戶端發(fā)送臨時(shí)重定向響應(yīng)

原理

當(dāng)執(zhí)行添加頁面功能時(shí),瀏覽器發(fā)送 add.do 請求給 Tomcat 服務(wù)器;

Tomcat 服務(wù)器的 AddServlet 收到 add.do 請求后,先訪問數(shù)據(jù)庫 DB 執(zhí)行插入新數(shù)據(jù)的操作,然后發(fā)送 302 狀態(tài)碼及重定向的新地址 Location: list.do 信息到瀏覽器;

瀏覽器根據(jù)新地址發(fā)送 list.do 請求給 Tomcat 服務(wù)器;

Tomcat 服務(wù)器的 ListServlet 收到 list.do 請求后,先訪問數(shù)據(jù)庫 DB 獲取 list 數(shù)據(jù),然后發(fā)送 200 狀態(tài)碼及 list 數(shù)據(jù)到瀏覽器;

瀏覽器根據(jù) list 數(shù)據(jù)展示頁面。

特點(diǎn)

重定向之后,瀏覽器地址欄的 URL 會發(fā)生改變。

重定向過程中會將前面 Request 對象銷毀,然后創(chuàng)建一個(gè)新的 Request 對象。

重定向的 URL 可以是其它項(xiàng)目工程。

轉(zhuǎn)發(fā)的概述

轉(zhuǎn)發(fā)的概念

一個(gè) Web 組件(Servlet/JSP)將未完成的處理通過容器轉(zhuǎn)交給另外一個(gè) Web 組件繼續(xù)處理,轉(zhuǎn)發(fā)的各個(gè)組件會共享 Request 和 Response 對象。

轉(zhuǎn)發(fā)的實(shí)現(xiàn)

  • 綁定數(shù)據(jù)到 Request 對象

Object getAttribute(String name) 將指定屬性值作為對象返回,若給定名稱屬性不存在,則返回空值

void setAttribute(String name,Object o) 在此請求中存儲屬性值

  • 獲取轉(zhuǎn)發(fā)器對象

RequestDispatcher getRequestDispatcher(String path) 返回一個(gè) RequestDispatcher 對象,該對象充當(dāng)位于給定路徑上的資源的包裝器

  • 轉(zhuǎn)發(fā)操作

void forward(ServletRequest request, ServletResponse response) 將請求從一個(gè) servlet 轉(zhuǎn)發(fā)到服務(wù)器上的另一個(gè)資源(Servlet、JSP文件或HTML文件)

轉(zhuǎn)發(fā)的特點(diǎn)

轉(zhuǎn)發(fā)之后瀏覽器地址欄的 URL 不會發(fā)生改變。

轉(zhuǎn)發(fā)過程中共享 Request 對象。

轉(zhuǎn)發(fā)的 URL 不可以是其它項(xiàng)目工程。

重定向和轉(zhuǎn)發(fā)的比較

  • 重定向訪問服務(wù)器兩次,轉(zhuǎn)發(fā)只訪問服務(wù)器一次。
  • 轉(zhuǎn)發(fā)頁面的 URL 不會改變,而重定向地址會改變。
  • 轉(zhuǎn)發(fā)只能轉(zhuǎn)發(fā)到自己的 web 應(yīng)用內(nèi),重定向可以重定義到任意資源路徑。
  • 轉(zhuǎn)發(fā)過程中共享 request 對象;而重定向會產(chǎn)生一個(gè)新的 request,不能共享 request 域信息與請求參數(shù)。
  • 轉(zhuǎn)發(fā)相當(dāng)于服務(wù)器內(nèi)部方法調(diào)用,轉(zhuǎn)發(fā)后面的代碼仍然會執(zhí)行;而重定向操作是方法執(zhí)行完成之后才進(jìn)行。
  • 無論是 RequestDispatcher.forward 方法,還是 HttpServletResponse.sendRedirect 方法,在調(diào)用它們之前,都不能有內(nèi)容已經(jīng)被實(shí)際輸出到了客戶端。如果緩沖區(qū)中已經(jīng)有了一些內(nèi)容,這些內(nèi)容將被從緩沖區(qū)中移除。
  • Servlet 線程安全

    服務(wù)器在收到請求之后,會啟動一個(gè)線程來進(jìn)行相應(yīng)的請求處理。

    默認(rèn)情況下,服務(wù)器為每個(gè) Servlet 只創(chuàng)建一個(gè)對象實(shí)例。當(dāng)多個(gè)請求訪問同一個(gè) Servlet 時(shí),會有多個(gè)線程訪問同一個(gè) Servlet 對象,此時(shí)就可能發(fā)生線程安全問題。

    多線程并發(fā)邏輯,需要使用 synchronized 對代碼加鎖處理,但盡量避免使用。

    狀態(tài)管理

    Web 程序基于 HTTP 協(xié)議通信,而 HTTP 協(xié)議是”無狀態(tài)”的協(xié)議,一旦服務(wù)器響應(yīng)完客戶的請求之后,就斷開連接,而同一個(gè)客戶的下一次請求又會重新建立網(wǎng)絡(luò)連接。

    服務(wù)器程序有時(shí)是需要判斷是否為同一個(gè)客戶發(fā)出的請求,比如客戶的多次選購商品。因此,有必要跟蹤同一個(gè)客戶發(fā)出的一系列請求。

    把瀏覽器與服務(wù)器之間多次交互作為一個(gè)整體,將多次交互所涉及的數(shù)據(jù)保存下來,即狀態(tài)管理。

    多次交互的數(shù)據(jù)狀態(tài)可以在客戶端保存,也可以在服務(wù)器端保存。

    狀態(tài)管理主要分為兩類:

    • 客戶端管理 - 將狀態(tài)保存在客戶端。基于 Cookie 技術(shù)實(shí)現(xiàn)。
    • 服務(wù)器管理 - 將狀態(tài)保存在服務(wù)器端?;?Session 技術(shù)實(shí)現(xiàn)。

    Cookie 技術(shù)

    基本概念

    Cookie 表示客戶端以“名-值”形式進(jìn)行保存的一種技術(shù)。

    瀏覽器向服務(wù)器發(fā)送請求時(shí),服務(wù)器將數(shù)據(jù)以 Set-Cookie 消息頭的方式響應(yīng)給瀏覽器,然后瀏覽器會將這些數(shù)據(jù)以文本文件的方式保存起來。

    當(dāng)瀏覽器再次訪問服務(wù)器時(shí),會將這些數(shù)據(jù)以 Cookie 消息頭的方式發(fā)送給服務(wù)器。

    相關(guān)的方法

    • 使用 javax.servlet.http.Cookie 類的構(gòu)造方法實(shí)現(xiàn) Cookie 的創(chuàng)建。

    Cookie(String name, String value) 根據(jù)參數(shù)指定數(shù)值構(gòu)造對象

    • 使用 javax.servlet.http.HttpServletResponse 接口的成員方法實(shí)現(xiàn) Cookie 的添加。

    void addCookie(Cookie cookie) 添加參數(shù)指定的對象到響應(yīng)

    • 使用 javax.servlet.http.HttpServletRequest 接口的成員方法實(shí)現(xiàn) Cookie 對象的獲取。

    Cookie[] getCookies() 返回此請求中包含的所有 Cookie 對象

    • 使用 javax.servlet.http.Cookie 類的構(gòu)造方法實(shí)現(xiàn) Cookie 對象中屬性的獲取和修改。

    String getName() 返回此 Cookie 對象中的名字

    String getValue() 返回此 Cookie 對象的數(shù)值

    void setValue(String newValue) 設(shè)置 Cookie 的數(shù)值

    Cookie 的生命周期

    • 默認(rèn)情況下,瀏覽器會將 Cookie 信息保存在內(nèi)存中,只要瀏覽器關(guān)閉,Cookie 信息就會消失。
    • 如果希望關(guān)閉瀏覽器后 Cookie 信息仍有效,可以通過 Cookie 類的成員方法實(shí)現(xiàn)。

    int getMaxAge() 返回cookie的最長使用期限(以秒為單位)

    void setMaxAge(int expiry) 設(shè)置cookie的最長保留時(shí)間(秒)

    Cookie 的路徑問題

    • 瀏覽器在訪問服務(wù)器時(shí),會比較 Cookie 的路徑與請求路徑是否匹配,只有匹配的 Cookie 才會發(fā)送給服務(wù)器。
    • Cookie 的默認(rèn)路徑等于添加這個(gè) Cookie 信息時(shí)的組件路徑,例如:/項(xiàng)目名/目錄/add.do 請求添加了一個(gè) Cookie 信息,則該 Cookie 的路徑是 /項(xiàng)目名/目錄。
    • 訪問的請求地址必須符合 Cookie 的路徑或者其子路徑時(shí),瀏覽器才會發(fā)送 Cookie 信息。如果訪問請求地址為 項(xiàng)目名/test.html,則路徑為 項(xiàng)目名 的 Cookie 信息會被發(fā)送到服務(wù)器;如果訪問請求地址為 項(xiàng)目名/目錄/test.html,則路徑為 項(xiàng)目名 和 項(xiàng)目名/目錄 的 Cookie 信息會被發(fā)送到服務(wù)器。

    void setPath(String uri) 設(shè)置 Cookie 的路徑信息

    Cookie 的特點(diǎn)

    Cookie 技術(shù)不適合存儲所有數(shù)據(jù),程序員只用于存儲少量、非敏感信息,原因如下:

    • 將狀態(tài)數(shù)據(jù)保存在瀏覽器端,不安全
    • 保存數(shù)據(jù)量有限制,大約 4 KB 左右
    • 只能保存字符串信息
    • 可以通過瀏覽器設(shè)置為禁止使用

    Session 技術(shù)

    基本概念

    Session 是用來維護(hù)一個(gè)客戶端和服務(wù)器關(guān)聯(lián)的一種技術(shù)。

    瀏覽器訪問服務(wù)器時(shí),服務(wù)器會為每一個(gè)瀏覽器都在服務(wù)器端的內(nèi)存中分配一個(gè)空間,用于創(chuàng)建一個(gè) Session 對象,該對象有一個(gè) id 屬性且該值唯一,我們稱為 SessionId,并且服務(wù)器會將這個(gè) SessionId 以 Cookie 方式發(fā)送給瀏覽器存儲。

    瀏覽器再次訪問服務(wù)器時(shí)會將 SessionId 發(fā)送給服務(wù)器,服務(wù)器可以依據(jù) SessionId 查找相對應(yīng)的 Session 對象。

    相關(guān)的方法

    • 使用 javax.servlet.http.HttpServletRequest 接口的成員方法實(shí)現(xiàn) Session 的獲取。

    HttpSession getSession() 返回此請求關(guān)聯(lián)的當(dāng)前 Session,若此請求沒有則創(chuàng)建一個(gè)

    • 使用 javax.servlet.http.HttpSession 接口的成員方法實(shí)現(xiàn)判斷和獲取。

    boolean isNew() 判斷是否為新創(chuàng)建的 Session

    String getId() 獲取 Session 的編號

    • 使用 javax.servlet.http.HttpSession 接口的成員方法實(shí)現(xiàn)屬性的管理。

    Object getAttribute(String name) 返回在此會話中用指定名稱綁定的對象,如果沒有對象在該名稱下綁定,則返回空值

    void setAttribute(String name, Object value) 使用指定的名稱將對象綁定到此會話

    void removeAttribute(String name) 從此會話中刪除與指定名稱綁定的對象

    Session 的生命周期

    • 為了節(jié)省服務(wù)器內(nèi)存空間資源,服務(wù)器會將空閑時(shí)間過長的 Session 對象自動清除掉,服務(wù)器默認(rèn)的超時(shí)限制一般是 30 分鐘。
    • 使用 javax.servlet.http.HttpSession 接口的成員方法實(shí)現(xiàn)失效實(shí)現(xiàn)的獲取和設(shè)置。

    int getMaxInactiveInterval() 獲取失效時(shí)間

    void setMaxInactiveInterval(int interval) 設(shè)置失效時(shí)間

    • 可以配置 web.xml 文件修改失效時(shí)間。
    30

    Session 的特點(diǎn)

    數(shù)據(jù)比較安全。

    能夠保存的數(shù)據(jù)類型豐富,而 Cookie 只能保存字符串。

    能夠保存更多的數(shù)據(jù),而 Cookie 大約保存 4 KB。

    數(shù)據(jù)保存在服務(wù)器端會占用服務(wù)器的內(nèi)存空間,如果存儲信息過多、用戶量過大,會嚴(yán)重影響服務(wù)器的性能。

    想了解更多,歡迎關(guān)注我的微信公眾號:Renda_Zhang

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。