Java Web中requset,session,application 的作用域及區別

Zxeao發表於2022-11-26

三者概述

requset概述:

request是表示一個請求,只要發出一個請求就會建立一個request
用處:常用於伺服器間同一請求不同頁面之間的引數傳遞,常應用於表單的控制元件值傳遞。

session概述:

伺服器會為每個會話建立一個session物件,所以session中的資料可供當前會話中所有servlet共享。
會話:使用者開啟瀏覽器會話開始,直到關閉瀏覽器會話才會結束。一次會話期間只會建立一個session物件。
用處:常用於web開發中的登陸驗證介面(當使用者登入成功後瀏覽器分配其一個session鍵值對)。

application概述:

Application屬性範圍值,只要設定一次,則所有的網頁視窗都可以取得資料。
ServletContext在伺服器啟動時建立,在伺服器關閉時銷燬,一個JavaWeb應用只建立一個ServletContext物件,所有的客戶端在訪問伺服器時都共享同一個ServletContext物件;
用處:ServletContext物件一般用於在多個客戶端間共享資料時使用;

具體案例

我寫了一個小demo,大家可以看一下,下面這是程式碼。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/getCount")
public class CountServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest requset, HttpServletResponse response) throws ServletException, IOException {
//        super.service(req, resp);

        Integer countRequset = (Integer) requset.getAttribute("count");
        if (countRequset==null) {
            countRequset = 0;
        }
        countRequset++;
        requset.setAttribute("count",countRequset);
        System.out.println("ok");

        Integer countSession = (Integer) requset.getSession().getAttribute("count");
        if (countSession==null) {
            countSession = 0;
        }
        countSession++;
        requset.getSession().setAttribute("count",countSession);

        Integer countContext = (Integer) requset.getSession().getServletContext().getAttribute("count");
        if (countContext==null) {
            countContext = 0;
        }
        countContext++;
        requset.getSession().getServletContext().setAttribute("count",countContext);

        requset.getRequestDispatcher("WEB-INF/page/count_page.jsp").forward(requset,response);

    }
}

我在程式碼中申明瞭三個變數,都是count,不同就在於不是同一個空間中的變數,我們來瀏覽器看看效果:

  • 這是在一個瀏覽器中,第一次進入之後的效果。
    image

  • 我在這個瀏覽器中重新整理8次:
    image
    可以看到,每次的請求都是1,其他的隨著我的重新整理次數而增加。

  • 我在其他瀏覽器輸入相同的訪問網址:
    image
    可以看到,請求和會話都重置,只有伺服器的次數是上一次的再加1。

上面是具體效果,下面我們來詳細的看看他們

三者共同作用

三者共同目的:

requset,session,application三者存在的意義就是前後端進行資料傳輸
三者使用各自的作用域進行傳遞資料和儲存資料

三者共有的常用屬性:

getAttribute()與setAttribute()

後端要透過getAttribute()進行資料的獲取以及透過setAttribute()進行設定屬性,然後資料被前端使用。
所以三者都可以透過 setAttribute() 賦值和 getAttribute() 取值。
同時還有其他類如removesetAttribute()等屬性,不做詳解。

三者主要區別

三者作用域不同

作用域大小為

requset(請求作用域)< session(會話作用域) < application(全域性作用範圍)

request:

第一個作用域是request,他僅在當前請求中有效。
作用域:一次HTTP請求到伺服器處理結束,返回響應的整個過程。

session:

第二個作用域是session,他在當前會話有效。
作用域:當一臺電腦上的同意瀏覽器對伺服器進行多次訪問的時候,在這多次訪問之間傳遞信的資訊就是session作用域的範圍。

application:

第三個作用域是application,它所在的所有應用程式中都有效。
作用域:如果不進行手工刪除,它們將一直可以使用,也就是當伺服器開始到伺服器結束的這段時間,application作用域中儲存的資料都是有效的,所有使用者均可使用。

request、session以及application這3個物件的作用域範圍是逐個增加的:

  • request只在一個請求的範圍內;
  • session 是在瀏覽器視窗的範圍內;
  • application則是在整個伺服器的執行過程中。

作用域選擇不正確會有什麼後果:

  • 作用域小了:不能在需要的場景獲得資料。
  • 作用域大了:記憶體浪費。

如何正確的選擇作用域

  • request:跟當前操作功能相關
  • session: 跟使用者資訊相關
  • application:跟專案全域性資訊相關----->京東配送地址

注意事項(備註&擴充套件)

request

request物件內資料存活範圍是當客戶端向伺服器傳送一個請求,伺服器向客戶端返回一個響應之後,該請求物件就被銷燬了。之後再次傳送的請求也無法獲取之前request物件存放的任何資料。

session

session是伺服器端物件,儲存在伺服器端。並且伺服器可以將建立session後產生的sessionid透過一個cookie返回給客戶端,以便下次驗證。(session底層依賴於cookie)
它從瀏覽器發出第一個HTTP請求即可認為是會話的開始,但是會話結束的時間是不確定的,因為在瀏覽器關閉的時候並不會通知伺服器,一般Tomcat設定的預設時間為120分鐘,也可以進行設定,或者是強制結束當前會話。

其他

這三者的setAttribute與getAttribute方法都是在伺服器端內部執行的,客戶端不知道伺服器端是否執行過這兩個方法。

是學生,正在學習,自己遇到的問題寫點部落格,如有錯誤,請諒解,如果發現了錯誤可以評論一下。

相關文章