主頁 > 軟體設計 > ??蘇州程式大白一文讓你學會Java Servlet基礎??《??記得收藏??》

??蘇州程式大白一文讓你學會Java Servlet基礎??《??記得收藏??》

2021-10-03 08:46:07 軟體設計

??蘇州程式大白一文讓你學會Java Servlet基礎??《??記得收藏??》

  • 目錄
  • 🏳??🌈開講啦!!!!🏳??🌈蘇州程式大白🏳??🌈
  • 🌟博主介紹
  • 🍇1、前言
  • 🍈2、闡述 Servlet 和 CGI 的區別?
  • 🍉3、Servlet 介面中有哪些方法及 Servlet 生命周期探秘
  • 🍊4、get 和 post 請求的區別
  • 🍋5、什么情況下呼叫 doGet () 和 doPost ()?
  • 🍌6、轉發 (Forward) 和重定向 (Redirect) 的區別
  • 🍍7、自動重繪 (Refresh)
  • 🍎8、Servlet 與執行緒安全
  • 🍏9、JSP 和 Servlet 是什么關系
  • 🍐10、JSP 作業原理
  • 🍑11、JSP 有哪些內置物件、作用分別是什么?
  • 🍒12、Request 物件的主要方法有哪些?
  • 🍓13、request.getAttribute () 和 request.getParameter () 有何區別
  • 🥝14、include 指令 include 的行為的區別
  • 🍅15、講解 JSP 中的四種作用域
  • 🥥16、如何實作 JSP 或 Servlet 的單執行緒模式
  • 🥑17、實作會話跟蹤的技術有哪些
  • 🍆18、Cookie 和 Session 的的區別
  • 🌟作者相關的文章、資源分享🌟
  • 🏳??🌈關注蘇州程式大白,持續更新技術分享,謝謝大家支持🏳??🌈

目錄

🏳??🌈開講啦!!!!🏳??🌈蘇州程式大白🏳??🌈

🌟博主介紹

💂 個人主頁:蘇州程式大白

🤟作者介紹:中國DBA聯盟(ACDU)成員,CSDN全國各地程式猿(媛)聚集地管理員,目前從事工業自動化軟體開發作業,擅長C#、Java、機器視覺、底層演算法等語言,2019年成立柒月軟體作業室,

💬如果文章對你有幫助,歡迎關注、點贊、收藏(一鍵三連)和C#、Halcon、python+opencv、VUE、各大公司面試等一些訂閱專欄哦

🎗? 承接各種軟體開發專案

💅 有任何問題歡迎私信,看到會及時回復

👤 微信號:stbsl6,微信公眾號:蘇州程式大白

🎯 想加入技術交流群的可以加我好友,群里會分享學習資料

在這里插入圖片描述

🍇1、前言

Java Web 程式中,Servlet 主要負責接受用戶請求 HttpServletRequest,在 doget ()doPost ()中做相應的處理,并將回應 HttpServletResponse反饋給用戶,

Servlet可以設定初始化引數,供 Servlet 內部使用,

一個Servlet 類只會有一個實體,在它的初始化時呼叫init () 方法,銷毀時呼叫destroy () 方法

Servlet需要在 web.xml 中配置(MyEclipse 中創建 Servlet 會自動配置),一個 Servlet 可以設定多個 URL 訪問

Servlet 不是執行緒安全,因此要謹慎使用類變數,

🍈2、闡述 Servlet 和 CGI 的區別?

CGI 的不足之處:

1、需要為每個請求啟動一個操作 CGI 程式的系統行程,如果請求頻繁,這將會帶來很大的開銷,

2、需要為每個請求加載和運行一個 CGI 程式,這將帶來很大的開銷.

3、需要重復撰寫處理網路協議的代碼以及編碼,這些作業都是非常耗時的,

Servlet 的優點:

1、只需要啟動一個作業系統行程以及加載一個 JVM,大大降低了系統的開銷,

2、如果多個請求需要做同樣處理的時候,這時候只需要加載一個類,這也大大降低了開銷,

3、所有動態加載的類可以實作對網路協議以及請求解碼的共享,大大降低了作業量,

4、Servlet 能直接和 Web 服務器互動,而普通的 CGI 程式不能,Servlet 還能在各個程式之間共享資料,使資料庫連接池之類的功能很容易實作,

補充:Sun Microsystems 公司在 1996 年發布 Servlet 技術就是為了和 CGI 進行競爭,Servlet 是一個特殊的 Java 程式,一個基于 Java 的 Web 應用通常包含一個或多個 Servlet 類 ,Servlet 不能夠自行創建并執行,它是在 Servlet 容器中運行的,容器將用戶的請求傳遞給 Servlet 程式,并將 Servlet 的回應回傳給用戶,通常一個 Servlet 會關聯一個或多個 JSP 頁面,以前 CGI 經常因為性能開銷上的問題被詬病,然而 Fast CGI 早就已經解決了 CGI 效率上的問題,所以面試的時候大可不必信口開河的詬病 CGI,事實上有很多你熟悉的網站都使用了 CGI 技術,

🍉3、Servlet 介面中有哪些方法及 Servlet 生命周期探秘

Servlet 介面定義了 5 個方法,其中前三個方法與 Servlet 生命周期相關:

void init (ServletConfig config) throws ServletException
voio servivce (ServlerRequest req, ServletResponse resp ) throws ServletException,java.io.IoException
void destroy()
java.lang.String getServletInfo()
ServletConfing getServletConfing()

生命周期: Web 容器加載Servlet 并將其實體化后,Servlet 生命周期開始,容器運行其 init () 方法進行 Servlet 的初始化;

請求到達時呼叫 Servletservice() 方法 ,service () 方法會根據需要呼叫與請求對應的doGetdoPost 等方法;

當服務器關倍訓專案被卸載時服務器會將 Servlet 實體銷毀,此時會呼叫 Servlet 的 destroy () 方法,

init 方法和 destroy 方法只會執行一次,service 方法客戶端每次請求 Servlet 都會執行,

ervlet 中有時會用到一些需要初始化與銷毀的資源,因此可以把初始化資源的代碼放入 init 方法中,銷毀資源的代碼放入 destroy 方法中,這樣就不需要每次處理客戶端的請求都要初始化與銷毀資源,

🍊4、get 和 post 請求的區別

可以把 getpost 當作兩個不同的行為,兩者并沒有什么本質區別,底層都是TCP 連接get 請求 用來從服務器上獲得資源,而 post 是用來向服務器提交資料,比如你要獲取人員串列可以用 get 請求 ,你需要創建一個人員可以用 post ,這也是 Restful API 最基本的一個要求,

最直觀的區別就是 GET 把引數包含在 URL 中,POST 通過 request body 傳遞引數,

  • GET 在瀏覽器回退時是無害的,而 POST 會再次提交請求,

  • GET 產生的 URL 地址可以被 Bookmark,而 POST 不可以,

  • GET 請求會被瀏覽器主動 cache,而 POST 不會,除非手動設定,

  • GET 請求只能進行 url 編碼,而 POST 支持多種編碼方式,

  • GET 請求引數會被完整保留在瀏覽器歷史記錄里,而 POST 中的引數不會被保留,

  • GET 請求在 URL 中傳送的引數是有長度限制的,而 POST 么有,

  • 對引數的資料型別,GET 只接受 ASCII 字符,而 POST 沒有限制,

  • GET 比 POST 更不安全,因為引數直接暴露在 URL 上,所以不能用來傳遞敏感資訊,

  • GET 引數通過 URL 傳遞,POST 放在 Request body 中,

其實,GET 和 POST 本質上沒有區別:

GET 和 POST 是什么HTTP 協議 中的兩種發送請求的方法,

HTTP 是什么HTTP 是基于 TCP/IP 的關于資料如何在萬維網中如何通信的協議,

HTTP 的底層TCP/IP ,所以 GETPOST 的底層也是 TCP/IP ,也就是說,GET/POST 都是 TCP 鏈接,GET 和 POST 能做的事情是一樣一樣的,你要給 GET 加上request body ,給 POST 帶上url 引數,技術上是完全行的通的,

在我大萬維網世界中,TCP 就像汽車,我們用 TCP 來運輸資料,它很可靠,從來不會發生丟件少件的現象,但是如果路上跑的全是看起來一模一樣的汽車,那這個世界看起來是一團混亂,送急件的汽車可能被前面滿載貨物的汽車攔堵在路上,整個交通系統一定會癱瘓,為了避免這種情況發生,交通規則 HTTP 誕生了,

HTTP 給汽車運輸設定了好幾個服務類別,有GET, POST, PUT, DELETE 等等 ,HTTP 規定,當執行 GET 請求的時候,要給汽車貼上 GET 的標簽 (設定 method 為 GET) ,而且要求把傳送的資料放在車頂上(url 中)以方便記錄,如果是 POST 請求,就要在車上貼上 POST 的標簽,并把貨物放在車廂里,當然,你也可以在 GET 的時候往車廂內偷偷藏點貨物,但是這是很不光彩;也可以在 POST 的時候在車頂上也放一些資料,讓人覺得傻乎乎的,HTTP 只是個行為準則,而 TCP 才是 GET 和 POST 怎么實作的基本,

但是,我們只看到HTTPGETPOST 引數的傳送渠道(url 還是 requrest body)提出了要求,“標準答案” 里關于引數大小的限制又是從哪來的呢?

在我大萬網路世界中,還有另一個重要的角色:運輸公司,不同的瀏覽器(發起 http 請求)和服務器(接受 http 請求)就是不同的運輸公司, 雖然理論上,你可以在車頂上無限的堆貨物(url 中無限加引數),但是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,資料量太大對瀏覽器和服務器都是很大負擔,業界不成文的規定是,(大多數)瀏覽器通常都會限制 url 長度在 2K 個位元組,而(大多數)服務器最多處理 64K 大小的 url,超過的部分,恕不處理,如果你用 GET 服務,在request body 偷偷藏了資料,不同服務器的處理方式也是不同的,有些服務器會幫你卸載,讀出資料,有些服務器直接忽略,所以,雖然 GET 可以帶 request body,也不能保證一定能被接收到哦,

GET 和 POST 本質上就是 TCP 鏈接,并無差別,但是由于 HTTP 的規定和瀏覽器 / 服務器的限制,導致他們在應用程序中體現出一些不同,

GET 和 POST 還有一個重大區別,簡單的說:

GET 產生一個 TCP 資料包;POST 產生兩個 TCP 資料包,

對于 GET 方式的請求,瀏覽器會把 http header 和 data 一并發送出去,服務器回應 200(回傳資料);
而對于 POST,瀏覽器先發送 header,服務器回應 100 continue,瀏覽器再發送 data,服務器回應 200 (回傳資料),

也就是說,GET 只需要汽車跑一趟就把貨送到了,而 POST 得跑兩趟,第一趟,先去和服務器打個招呼 “嗨,我等下要送一批貨來,你們打開門迎接我”,然后再回頭把貨送過去,

因為 POST 需要兩步,時間上消耗的要多一點,看起來 GET 比 POST 更有效,因此 Yahoo 團隊有推薦用 GET 替換 POST 來優化網站性能,但這是一個坑!為什么?

1、GET 與 POST 都有自己的語意,不能隨便混用,

2、據研究,在網路環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視,而在網路環境差的情況下,兩次包的 TCP 在驗證資料包完整性上,有非常大的優點,

3、并不是所有瀏覽器都會在 POST 中發送兩次包,Firefox 就只發送一次,

🍋5、什么情況下呼叫 doGet () 和 doPost ()?

Form 標簽里的 method 的屬性get 時呼叫 doGet (),為 post 時呼叫 doPost ()

🍌6、轉發 (Forward) 和重定向 (Redirect) 的區別

在這里插入圖片描述

轉發是服務器行為,重定向是客戶端行為,

轉發(Forward)
通過 RequestDispatcher 物件的 forward(HttpServletRequest request,HttpServletResponse response)方法實作的,RequestDispatcher 可以通過 HttpServletRequestgetRequestDispatcher () 方法獲得,

例如下面的代碼就是跳轉到 login_success.jsp 頁面,

request.getRequeDispatcher("login_success.jsp").forward(request,response);

重定向(Redirect) 是利用服務器回傳的狀態碼來實作的,

客戶端瀏覽器請求服務器的時候,服務器會回傳一個狀態碼,服務器通過 HttpServletResponsesetStatus (int status) 方法設定狀態碼,如果服務器回傳 301 或者 302,則瀏覽器會到新的網址重新請求該資源,

1、從地址欄顯示來說

  • forward 是服務器請求資源,服務器直接訪問目標地址的 URL, 把那個 URL 的回應內容讀取過來,然后把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容從哪里來的,所以它的地址欄還是原來的地址,

  • redirect 是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,所以地址欄顯示的是新的 URL,

2、從資料共享來說

  • forward: 轉發頁面和轉發到的頁面可以共享 request 里面的資料,

  • redirect: 不能共享資料,

3、從運用地方來說

  • forward: 一般用于用戶登陸的時候,根據角色轉發到相應的模塊,

  • redirect: 一般用于用戶注銷登陸時回傳主頁面和跳轉到其它的網站等,

4、從效率來說

  • forward: 高,

  • redirect: 低,

🍍7、自動重繪 (Refresh)

自動重繪不僅可以實作一段時間之后自動跳轉到另一個頁面,還可以實作一段時間之后自動重繪本頁面,

Servlet 中通過 HttpServletResponse 物件設定 Header 屬性實作自動重繪例如:

Response.setHeader("Refresh","5;" "URL=https://csdnimg.cn/release/blogv2/dist/pc/img/newCommentBlack.png");

其中 5 為時間,單位為秒,URL 指定就是要跳轉的頁面(如果設定自己的路徑,就會實作每過 5 秒自動重繪本頁面一次)

🍎8、Servlet 與執行緒安全

在這里插入圖片描述

Servlet 不是執行緒安全的,多執行緒并發的讀寫會導致資料不同步的問題,

解決的辦法是盡量不要定義 name 屬性,而是要把 name 變數分別定義在 doGet ()doPost ()方法內,

雖然使用synchronized (name){}陳述句塊可以解決問題,但是會造成執行緒的等待,不是很科學的辦法,

注意:多執行緒的并發的讀寫 Servlet 類屬性會導致資料不同步,但是如果只是并發地讀取屬性而不寫入,則不存在資料不同步的問題,因此 Servlet 里的只讀屬性最好定義為 final 型別的,

🍏9、JSP 和 Servlet 是什么關系

其實這個問題在上面已經闡述過了,Servlet 是一個特殊的 Java 程式,它運行于服務器的 JVM 中,能夠依靠服務器的支持向瀏覽器提供顯示內容,

JSP 本質上是 Servlet的一種簡易形式,JSP 會被服務器處理成一個類似于 Servlet 的 Java 程式,可以簡化頁面內容的生成,ServletJSP 最主要的不同點在于,Servlet的應用邏輯是在 Java 檔案中,并且完全從表示層中的 HTML 分離開來,

JSP的情況是 JavaHTML可以組合成一個擴展名為.jsp 的檔案

有人說,Servlet就是在 Java 中寫 HTML,而 JSP 就是在 HTML 中寫 Java 代碼,當然這個說法是很片面且不夠準確的,

JSP側重于視圖,Servlet更側重于控制邏輯,在 MVC 架構模式中,JSP 適合充當視圖(view)而 Servlet 適合充當控制器(controller),

🍐10、JSP 作業原理

在這里插入圖片描述
JSP 是一種 Servlet,但是與 HttpServlet的作業方式不太一樣,HttpServlet是先由源代碼編譯為class 檔案后部署到服務器下,為先編譯后部署,而 JSP 則是先部署后編譯,

JSP 會在客戶端第一次請求 JSP 檔案時被編譯為 HttpJspPage 類(介面 Servlet 的一個子類),該類會被服務器臨時存放在服務器作業目錄里面,

下面通過實體給大家介紹, 工程 JspLoginDemo 下有一個名為 login.jsp 的 Jsp 檔案,把工程第一次部署到服務器上后訪問這個 Jsp 檔案,我們發現這個目錄下多了下圖這兩個東東, .class 檔案便是 JSP 對應的 Servlet,編譯完畢后再運行 class 檔案來回應客戶端請求,以后客戶端訪問 login.jsp 的時候,Tomcat 將不再重新編譯 JSP 檔案,而是直接呼叫 class 檔案來回應客戶端請求,

在這里插入圖片描述
由于 JSP 只會在客戶端第一次請求的時候被編譯 ,因此第一次請求 JSP 時會感覺比較慢,之后就會感覺快很多,如果把服務器保存的 class 檔案洗掉,服務器也會重新編譯 JSP

開發 Web 程式時經常需要修改 JSP,Tomcat 能夠自動檢測到 JSP 程式的改動,如果檢測到 JSP 源代碼發生了改動,Tomcat會在下次客戶端請求 JSP 時重新編譯 JSP,而不需要重啟 Tomcat,這種自動檢測功能是默認開啟的,檢測改動會消耗少量的時間,在部署 Web 應用的時候可以在 web.xml 中將它關掉,

🍑11、JSP 有哪些內置物件、作用分別是什么?

在這里插入圖片描述

JSP 有 9 個內置物件:

  • request:封裝客戶端的請求,其中包含來自 GET 或 POST 請求的引數,

  • response:封裝服務器對客戶端的回應,

  • pageContext:通過該物件可以獲取其他物件,

  • session:封裝用戶會話的物件,

  • application:封裝服務器運行環境的物件,

  • out:輸出服務器回應的輸出流物件,

  • config:Web 應用的配置物件,

  • page:JSP 頁面本身(相當于 Java 程式中的 this),

  • exception:封裝頁面拋出例外的物件,

🍒12、Request 物件的主要方法有哪些?

  • setAttribute (String name,Object):設定名字為 name 的 request 的引數值,

  • getAttribute (String name):回傳由 name 指定的屬性值,

  • getAttributeNames ():回傳 request 物件所有屬性的名字集合,結果是一個列舉的實體,

  • getCookies ():回傳客戶端的所有 Cookie 物件,結果是一個 Cookie 陣列,

  • getCharacterEncoding ():回傳請求中的字符編碼方式 = getContentLength () :回傳請求的 Body 的長度,

  • getHeader (String name):獲得 HTTP 協議定義的檔案頭資訊,

  • getHeaders (String name):回傳指定名字的 request Header 的所有值,結果是一個列舉的實體,

  • getHeaderNames ():回傳所以 request Header 的名字,結果是一個列舉的實體,

  • getInputStream ():回傳請求的輸入流,用于獲得請求中的資料,

  • getMethod ():獲得客戶端向服務器端傳送資料的方法,

  • getParameter (String name) :獲得客戶端傳送給服務器端的有 name 指定的引數值,

  • getParameterNames ():獲得客戶端傳送給服務器端的所有引數的名字,結果是一個列舉的實體,

  • getParameterValues (String name):獲得有 name 指定的引數的所有值,

  • getProtocol ():獲取客戶端向服務器端傳送資料所依據的協議名稱,

  • getQueryString () :獲得查詢字串,

  • getRequestURI ():獲取發出請求字串的客戶端地址,

  • getRemoteAddr ():獲取客戶端的 IP 地址,

  • getRemoteHost ():獲取客戶端的名字,

  • getSession ([Boolean create]):回傳和請求相關 Session,

  • getServerName () :獲取服務器的名字,

  • getServletPath ():獲取客戶端所請求的腳本檔案的路徑,

  • getServerPort ():獲取服務器的埠號,

  • removeAttribute (String name):洗掉請求中的一個屬性,

🍓13、request.getAttribute () 和 request.getParameter () 有何區別

1、從獲取方向來看:

getParameter () 是獲取 POST/GET 傳遞的引數值,

getAttribute () 是獲取物件容器中的資料值,

2、從用途來看:

getParameter () 用于客戶端重定向時,即點擊了鏈接或提交按扭時傳值用,即用于在用表單或 url 重定向傳值時接收資料用,

getAttribute () 用于服務器端重定向時,即在 sevlet 中使用了 forward 函式,或 struts 中使用了 mapping.findForward

getAttribute 只能收到程式用 setAttribute 傳過來的值,

另外,可以用 setAttribute () , getAttribute () 發送接收物件,而 getParameter () 顯然只能傳字串, setAttribute () 是應用服務器把這個物件放在該頁面所對應的一塊記憶體中去,當你的頁面服務器重定向到另一個頁面時,應用服務器會把這塊記憶體拷貝另一個頁面所對應的記憶體中,這樣 setAttribute () 就能取得你所設下的值,當然這種方法可以傳物件,session 也一樣,只是物件在記憶體中的生命周期不一樣而已,getParameter () 只是應用服務器在分析你送上來的 request 頁面的文本時,取得你設在表單或 url 重定向時的值,

3、最后總結:

getParameter () 回傳的是 String, 用于讀取提交的表單中的值;(獲取之后會根據實際需要轉換為自己需要的相應型別,比如整型,日期型別啊等等)getAttribute () 回傳的是 Object,需進行轉換,可用 setAttribute () 設定成任意物件,使用很靈活,可隨時用,

🥝14、include 指令 include 的行為的區別

include 指令: JSP 可以通過 include 指令來包含其他檔案,被包含的檔案可以是 JSP 檔案、HTML 檔案或文本檔案,包含的檔案就好像是該 JSP 檔案的一部分,會被同時編譯執行,

語法格式如下:

 <%@ include file=” 檔案相對 url 地址” %>

include 動作: 動作元素用來包含靜態和動態的檔案,該動作把指定檔案插入正在生成的頁面,

語法格式如下:

 <jsp:include page=” 相對 URL 地址” flush=”true” />

🍅15、講解 JSP 中的四種作用域

JSP 中的四種作用域包括 page、request、session 和 application,具體來說:

1、page 代表與一個頁面相關的物件和屬性,

2、request 代表與 Web 客戶機發出的一個請求相關的物件和屬性,一個請求可能跨越多個頁面,涉及多個 Web 組件;需要在頁面顯示的臨時資料可以置于此作用域,

3、session 代表與某個用戶與服務器建立的一次會話相關的物件和屬性,跟某個用戶相關的資料應該放在用戶自己的 session 中,

4、application 代表與整個 Web 應用程式相關的物件和屬性,它實質上是跨越整個 Web 應用程式,包括多個頁面、請求和會話的一個全域作用域,

🥥16、如何實作 JSP 或 Servlet 的單執行緒模式

對于 JSP 頁面,可以通過 page 指令進行設定,<%@page isTreadSafe=”false”%>

對于 Servlet,可以讓自定義的 Servlet 實作 SingleThreadModel 標識介面,

說明:如果將 JSP 或 Servlet 設定成單執行緒作業模式,會導致每個請求創建一個 Servlet 實體,這種實踐將導致嚴重的性能問題(服務器的記憶體壓力很大,還會導致頻繁的垃圾回收),所以通常情況下并不會這么做,

🥑17、實作會話跟蹤的技術有哪些

1、使用 Cookie

向客戶端發送 Cookie

Cookie c=new Cookie ("name","value");
c.setMaxAge(60*60*24);
response.addCookie(c);

從客戶端讀取 Cookie

String name= "name";
Cookie[]cookies = request.getCookies();
if(cookies  ! = null){
for(int  i=0;i<cookies.length;i++){
Cookie cookie  =cookies[i];
if(name.equals(cookis.getName()))
ciikue.getValue();
}
}

優點:資料可以持久保存,不需要服務器資源,簡單,基于文本的 Key-Value,

缺點:大小受到限制,用戶可以禁用 Cookie 功能,由于保存在本地,有一定的安全風險,

2、URL 重寫

在 URL 中添加用戶會話的資訊作為請求的引數,或者將唯一的會話 ID 添加到 URL 結尾以標識一個會話,

優點: 在 Cookie 被禁用的時候依然可以使用

缺點: 必須對網站的 URL 進行編碼,所有頁面必須動態生成,不能用預先記錄下來的 URL 進行訪問,

3、隱藏的表單域

< input  tupe="hidden"   name= " seeion"  value =" ..."/>

優點: Cookie 被禁時可以使用,

缺點: 所有頁面必須是表單提交之后的結果,

4、HttpSession

在所有會話跟蹤技術中,HttpSession 物件是最強大也是功能最多的,當一個用戶第一次訪問某個網站時會自動創建 HttpSession,每個用戶可以訪問他自己的HttpSession

可以通過 HttpServletRequest 物件getSession 方法獲得 HttpSession,通過 HttpSessionsetAttribute 方法可以將一個值放在HttpSession中,通過呼叫 HttpSession 物件getAttribute 方法,同時傳入屬性名就可以獲取保存在 HttpSession 中的物件

與上面三種方式不同的 是,HttpSession放在服務器的記憶體中,因此不要將過大的物件放在里面,即使目前的 Servlet 容器可以在記憶體將滿時將HttpSession中的物件移到其他存盤設備中,但是這樣勢必影響性能,

添加到 HttpSession中的值可以是任意 Java 物件,這個物件最好實作了 Serializable 介面,這樣 Servlet 容器在必要的時候可以將其序列化到檔案中,否則在序列化時就會出現例外,

🍆18、Cookie 和 Session 的的區別

在這里插入圖片描述
1、Cookie 和 Session 都是用來跟蹤瀏覽器用戶身份的會話方式,但是兩者的應用場景不太一樣,

2、Cookie 一般用來保存用戶資訊 比如:

  • ①我們在 Cookie 中保存已經登錄過得用戶資訊,下次訪問網站的時候頁面可以自動幫你登錄的一些基本資訊給填了,

  • ②一般的網站都會有保持登錄也就是說下次你再訪問網站的時候就不需要重新登錄了,這是因為用戶登錄的時候我們可以存放了一個 Token 在 Cookie 中,下次登錄的時候只需要根據 Token 值來查找用戶即可 (為了安全考慮,重新登錄一般要將 Token 重寫),

  • ③登錄一次網站后訪問網站其他頁面不需要重新登錄,Session 的主要作用就是通過服務端記錄用戶的狀態, 典型的場景是購物車,當你要添加商品到購物車的時候,系統不知道是哪個用戶操作的,因為 HTTP 協議是無狀態的,服務端給特定的用戶創建特定的 Session 之后就可以標識這個用戶并且跟蹤這個用戶了,

3、Cookie 資料保存在客戶端 (瀏覽器端),Session 資料保存在服務器端,

4、Cookie 存盤在客戶端中,而 Session 存盤在服務器上,相對來說 Session 安全性更高,如果使用 Cookie 的一些敏感資訊不要寫入 Cookie 中,最好能將 Cookie 資訊加密然后使用到的時候再去服務器端解密,

🌟作者相關的文章、資源分享🌟

🌟讓天下沒有學不會的技術🌟

學習C#不再是難問題

🌳《C#入門到高級教程》🌳

有關C#實戰專案

👉C#RS232C通訊原始碼👈

👉C#委托資料傳輸👈

👉C# Modbus TCP 源代碼👈

👉C# 倉庫管理系統原始碼👈

👉C# 歐姆龍通訊Demo👈

👉C#+WPF+SQL目前在某市上線的車管所攝像系統👈

👉2021C#與Halcon視覺通用的框架👈

👉2021年視覺專案中利用C#完成三菱PLC與上位機的通訊👈

👉VP聯合開源深度學習編程(WPF)👈

?有關C#專案歡迎各位查看個人主頁?

🌟機器視覺、深度學習🌟

學習機器視覺、深度學習不再是難問題

🌌《Halcon入門到精通》🌌

🌌《深度學習資料與教程》🌌

有關機器視覺、深度學習實戰

👉2021年C#+HALCON視覺軟體👈

👉2021年C#+HALCON實作模板匹配👈

👉C#集成Halcon的深度學習軟體👈

👉C#集成Halcon的深度學習軟體,帶[MNIST例子]資料集👈

👉C#支持等比例縮放拖動的halcon WPF開源表單控制元件👈

👉2021年Labview聯合HALCON👈

👉2021年Labview聯合Visionpro👈

👉基于Halcon及VS的動車組制動閘片厚度自動識別模塊👈

?有關機器視覺、深度學習實戰歡迎各位查看個人主頁?

🌟Java、資料庫教程與專案🌟

學習Java、資料庫教程不再是難問題

🍏《JAVA入門到高級教程》🍏

🍏《資料庫入門到高級教程》🍏

有關Java、資料庫專案實戰

👉Java經典懷舊小霸王網頁游戲機原始碼增強版👈

👉js+css類似網頁版網易音樂原始碼👈

👉Java物業管理系統+小程式原始碼👈

👉JavaWeb家居電子商城👈

👉JAVA酒店客房預定管理系統的設計與實作SQLserver👈

👉JAVA圖書管理系統的研究與開發MYSQL👈

?有關Java、資料庫教程與專案實戰歡迎各位查看個人主頁?

🌟分享Python知識講解、分享🌟

學習Python不再是難問題

🥝《Python知識、專案專欄》🥝

🥝《Python 檢測抖音關注賬號是否封號程》🥝

🥝《手把手教你Python+Qt5安裝與使用》🥝

🥝《用一萬字給小白全面講解python編程基礎問答》🥝

🥝《Python 繪制Android CPU和記憶體增長曲線》🥝

有關Python專案實戰

👉Python基于Django圖書管理系統👈

👉Python管理系統👈

👉2021年9個常用的python爬蟲原始碼👈

👉python二維碼生成器👈

?有關Python教程與專案實戰歡迎各位查看個人主頁?

🌟分享各大公司面試題、面試流程🌟

面試成功不是難事

🍏《2021年金九銀十最新的VUE面試題??《??記得收藏??》》🍏

🍏《只要你認真看完一萬字??Linux作業系統基礎知識??分分鐘鐘都吊打面試官《??記得收藏??》》🍏

🍏《??用一萬字給小白全面講解python編程基礎問答??《😀記得收藏不然看著看著就不見了😀》》🍏

?有關各大公司面試題、面試流程歡迎各位查看個人主頁?

在這里插入圖片描述

🏳??🌈關注蘇州程式大白,持續更新技術分享,謝謝大家支持🏳??🌈

在這里插入圖片描述

??關注蘇州程式大白公眾號??


👇 👇👇

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/304979.html

標籤:其他

上一篇:夯實基礎,前端大廠面試題必練 - 總結篇

下一篇:C語言:動態記憶體錯誤

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more