偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

21 道JavaWeb經(jīng)典面試題總結(jié)

開(kāi)發(fā) 后端
Servlet 是 Java Web 應(yīng)用程序中處理客戶端請(qǐng)求并生成響應(yīng)的重要組件,它提供了一個(gè)在 Java Web 應(yīng)用程序中處理客戶端請(qǐng)求的標(biāo)準(zhǔn)化方式,并且可以通過(guò)實(shí)現(xiàn)不同的 Servlet 類(lèi)來(lái)實(shí)現(xiàn)特定的業(yè)務(wù)邏輯。

1.說(shuō)說(shuō) Servlet 的基本架構(gòu)

Servlet 是 Java Web 應(yīng)用程序中處理客戶端請(qǐng)求并生成響應(yīng)的重要組件,它的基本架構(gòu)可以分為以下幾個(gè)部分:

(1)Servlet 接口

Servlet 接口是所有 Servlet 類(lèi)必須實(shí)現(xiàn)的接口,它定義了處理客戶端請(qǐng)求的常見(jiàn)方法,包括初始化、請(qǐng)求處理和銷(xiāo)毀等。在 Servlet 接口中,最常見(jiàn)的方法包括 init()、service() 和 destroy()。

(2)Servlet 容器

Servlet 容器是負(fù)責(zé)管理和運(yùn)行 Servlet 的環(huán)境,可以理解為一個(gè) Web 服務(wù)器或者應(yīng)用服務(wù)器。Servlet 容器負(fù)責(zé)加載、實(shí)例化、初始化、調(diào)用服務(wù)方法和銷(xiāo)毀 Servlet 實(shí)例。在 Java 中,常見(jiàn)的 Servlet 容器包括 Tomcat、Jetty、Undertow 等。

(3)部署描述符

部署描述符是一個(gè) XML 文件,它包含了關(guān)于 Servlet 的配置信息,包括 Servlet 名稱、URL 映射、初始化參數(shù)、引入其他 Servlet 或過(guò)濾器等。在 Java Web 應(yīng)用中,典型的部署描述符是 web.xml 文件。

(4)Servlet 類(lèi)

Servlet 類(lèi)是實(shí)現(xiàn) Servlet 接口的具體類(lèi),它負(fù)責(zé)處理客戶端請(qǐng)求并生成響應(yīng)。在 Servlet 類(lèi)中,通常實(shí)現(xiàn)了 init()、service() 和 destroy() 方法,也可以覆蓋 doGet()、doPost() 等方法來(lái)處理不同類(lèi)型的請(qǐng)求。

(5)請(qǐng)求和響應(yīng)對(duì)象

在 Servlet 中,可以通過(guò)請(qǐng)求對(duì)象 HttpServletRequest 和響應(yīng)對(duì)象 HttpServletResponse 來(lái)與客戶端進(jìn)行通信。請(qǐng)求對(duì)象封裝了客戶端發(fā)送的請(qǐng)求信息,而響應(yīng)對(duì)象負(fù)責(zé)生成服務(wù)器返回的響應(yīng)內(nèi)容。

當(dāng)客戶端發(fā)送請(qǐng)求時(shí),Servlet 容器會(huì)根據(jù)部署描述符中的映射信息選擇合適的 Servlet 實(shí)例來(lái)處理請(qǐng)求。Servlet 實(shí)例接收到請(qǐng)求后,調(diào)用其 service() 方法來(lái)處理請(qǐng)求并生成響應(yīng)。然后響應(yīng)會(huì)被發(fā)回客戶端。

這就是 Servlet 的基本架構(gòu),它提供了一個(gè)在 Java Web 應(yīng)用程序中處理客戶端請(qǐng)求的標(biāo)準(zhǔn)化方式,并且可以通過(guò)實(shí)現(xiàn)不同的 Servlet 類(lèi)來(lái)實(shí)現(xiàn)特定的業(yè)務(wù)邏輯。

2.說(shuō)一說(shuō) Servlet 的生命周期?

Servlet 的生命周期包括的階段:

加載和實(shí)例化:當(dāng)容器啟動(dòng)時(shí),會(huì)根據(jù)部署描述符(web.xml)或注解等配置信息加載并實(shí)例化 Servlet。容器會(huì)創(chuàng)建 ServletConfig 對(duì)象,并將部署描述符中的初始化參數(shù)傳遞給 Servlet 實(shí)例。

初始化:在 Servlet 實(shí)例化后,容器會(huì)調(diào)用其 init() 方法來(lái)執(zhí)行一些初始化任務(wù)。通??梢栽?init() 方法中進(jìn)行一些初始化操作,比如建立數(shù)據(jù)庫(kù)連接、加載配置文件等。init() 方法只會(huì)在 Servlet 實(shí)例第一次被創(chuàng)建時(shí)執(zhí)行一次。

服務(wù)請(qǐng)求:一旦初始化完成,Servlet 就可以響應(yīng)客戶端的請(qǐng)求。當(dāng)客戶端發(fā)送請(qǐng)求時(shí),Servlet 容器會(huì)調(diào)用 Servlet 的 service() 方法來(lái)處理請(qǐng)求。service() 方法會(huì)根據(jù)請(qǐng)求類(lèi)型(GET、POST 等)來(lái)調(diào)用相應(yīng)的 doGet()、doPost() 等方法。這是 Servlet 生命周期中最頻繁調(diào)用的階段,用來(lái)處理客戶端的請(qǐng)求并生成響應(yīng)。

銷(xiāo)毀:當(dāng) Servlet 容器決定將 Servlet 實(shí)例銷(xiāo)毀時(shí),會(huì)調(diào)用其 destroy() 方法。在 destroy() 方法中可以清理資源,比如關(guān)閉數(shù)據(jù)庫(kù)連接、釋放內(nèi)存等。Servlet 實(shí)例銷(xiāo)毀時(shí)會(huì)執(zhí)行 destroy() 方法,代表 Servlet 生命周期的結(jié)束。

3.如何實(shí)現(xiàn)一個(gè)自定義的 servlet?

  • 創(chuàng)建一個(gè)新的 Java 類(lèi),并讓它繼承 HttpServlet 類(lèi)。這樣可以確保你的類(lèi)成為一個(gè) Servlet;
  • 在你的自定義類(lèi)中,你需要重寫(xiě) doGet 或 doPost 方法。這些方法將定義你的 Servlet 處理請(qǐng)求的行為;
  • 將你的自定義 Servlet 編譯成 .class 文件,并將它放在 WEB-INF/classes 目錄下(或者將 .class 文件打包成 .war 文件放在 webapps 目錄下)。你還需要在 web.xml 文件中配置你的 Servlet。

如下所示:

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.nezha.MyServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/myservlet</url-pattern>
</servlet-mapping>

根據(jù)實(shí)際需求,你可能需要處理初始化、銷(xiāo)毀等其他方法。另外,你也可以使用注解來(lái)代替 web.xml 的配置。

4.servlet中有哪些核心類(lèi)?都有什么特點(diǎn)?

(1)Servlet 接口

Servlet 接口是所有 servlet 類(lèi)的基礎(chǔ)接口。所有的 Servlet 類(lèi)都必須實(shí)現(xiàn)這個(gè)接口,并且提供處理客戶端請(qǐng)求的邏輯。在 Servlet 接口中定義了一系列的生命周期方法,包括 init、service 和 destroy。通過(guò)實(shí)現(xiàn)這些方法,可以在 servlet 實(shí)例的生命周期中執(zhí)行初始化、處理請(qǐng)求和資源銷(xiāo)毀等操作。

(2)HttpServlet

HttpServlet 是 Servlet 的抽象子類(lèi),它提供了專(zhuān)門(mén)用于處理 HTTP 請(qǐng)求的方法。它進(jìn)一步擴(kuò)展了 GenericServlet,并增加了處理 HTTP GET、POST、PUT、DELETE 等請(qǐng)求的方法。大多數(shù) Web 應(yīng)用程序中的 Servlet 都是繼承自 HttpServlet。

(3)HttpServletRequest

代表客戶端的請(qǐng)求信息,包含了請(qǐng)求行、請(qǐng)求頭和請(qǐng)求體等信息,提供了獲取參數(shù)、請(qǐng)求頭數(shù)據(jù)、請(qǐng)求屬性等方法。

(4)HttpServletResponse

代表服務(wù)器的響應(yīng)信息,用于構(gòu)建和發(fā)送回客戶端的響應(yīng),提供了設(shè)置狀態(tài)碼、添加響應(yīng)頭、寫(xiě)入響應(yīng)體等方法。

5.什么情況下調(diào)用 doGet()和 doPost()?

當(dāng)客戶端發(fā)送的請(qǐng)求使用了 HTTP GET 方法時(shí),Servlet 容器會(huì)調(diào)用 Servlet 的 doGet() 方法來(lái)處理該請(qǐng)求。

當(dāng)客戶端發(fā)送的請(qǐng)求使用了 HTTP POST 方法時(shí),Servlet 容器會(huì)調(diào)用 Servlet 的 doPost() 方法來(lái)處理該請(qǐng)求。

GET請(qǐng)求通常用于請(qǐng)求數(shù)據(jù)或查詢信息,它的特點(diǎn)是請(qǐng)求的數(shù)據(jù)會(huì)附加在URL之后,并且是可見(jiàn)的。因此,GET請(qǐng)求不適合傳輸敏感信息,如密碼或銀行賬戶信息。

POST 請(qǐng)求通常用于向服務(wù)器發(fā)送數(shù)據(jù),進(jìn)行數(shù)據(jù)修改、提交或發(fā)送較大的數(shù)據(jù)等操作。比如,向服務(wù)器提交表單數(shù)據(jù)。

6.request.getAttribute() 和 request.getParameter() 有何區(qū)別?

request.getParameter() 方法用于獲取客戶端請(qǐng)求中的查詢參數(shù)(GET 請(qǐng)求)或表單參數(shù)(POST 請(qǐng)求)。它返回的是一個(gè)字符串類(lèi)型,用于表示指定參數(shù)名對(duì)應(yīng)的參數(shù)值。

request.getAttribute() 方法用于獲取在服務(wù)器端范圍內(nèi)共享的數(shù)據(jù),這些數(shù)據(jù)通常是通過(guò)服務(wù)器端代碼設(shè)置到請(qǐng)求域中的。它返回的是一個(gè) Object 類(lèi)型的數(shù)據(jù),因此需要進(jìn)行類(lèi)型轉(zhuǎn)換才能使用。通過(guò) request.setAttribute() 方法設(shè)置的數(shù)據(jù)可以在同一個(gè)請(qǐng)求中的不同資源(如 Servlet、JSP)之間共享。

7.forward 和 redirect 的區(qū)別?

可以從三個(gè)方面來(lái)回答,處理方式、應(yīng)用場(chǎng)景、效率。

forward是服務(wù)器內(nèi)部的資源轉(zhuǎn)發(fā),瀏覽器地址欄不會(huì)發(fā)生變化,用戶無(wú)法感知到轉(zhuǎn)發(fā)過(guò)程。而redirect則是服務(wù)端通知客戶端進(jìn)行頁(yè)面跳轉(zhuǎn),客戶端會(huì)發(fā)起新的請(qǐng)求到指定的URL,因此瀏覽器地址欄會(huì)顯示新的地址。

forward通常用于需要根據(jù)用戶角色或其他條件來(lái)展示不同內(nèi)容的情況,比如登錄后根據(jù)用戶權(quán)限轉(zhuǎn)發(fā)到不同的管理頁(yè)面。而redirect則常用于需要用戶重新登錄或在完成某項(xiàng)操作后返回上一個(gè)頁(yè)面的場(chǎng)景,如注銷(xiāo)后重定向到登錄頁(yè)面。

forward由于是服務(wù)器內(nèi)部處理,通常效率較高,因?yàn)樗苊饬祟~外的網(wǎng)絡(luò)請(qǐng)求和響應(yīng)的延遲。而redirect因?yàn)樯婕暗娇蛻舳说亩啻握?qǐng)求和響應(yīng),所以效率相對(duì)較低。

8.jsp 有哪些內(nèi)置對(duì)象?作用分別是什么?

  • request,客戶端的請(qǐng)求,用于獲取客戶端通過(guò)HTTP協(xié)議發(fā)送到服務(wù)器的數(shù)據(jù),包括請(qǐng)求頭、請(qǐng)求參數(shù)、請(qǐng)求方式等。
  • response,服務(wù)器的響應(yīng),用于向客戶端發(fā)送數(shù)據(jù),包括設(shè)置響應(yīng)頭、發(fā)送響應(yīng)體等。
  • out,用于向客戶端輸出內(nèi)容,是JSP頁(yè)面中的輸出流。
  • session,表示客戶端與服務(wù)器之間的一次會(huì)話,用于保存用戶的狀態(tài)信息,如用戶登錄信息、購(gòu)物車(chē)數(shù)據(jù)等。
  • application,代表整個(gè)Web應(yīng)用的上下文,用于保存全局的信息,這些信息在整個(gè)Web應(yīng)用中都是可見(jiàn)的。
  • pageContext,提供了對(duì)JSP頁(yè)面內(nèi)各種對(duì)象(如request、response、session等)的訪問(wèn),以及用于查找其他資源的API。
  • config,用于獲取JSP頁(yè)面的初始化參數(shù)和Servlet上下文信息。
  • page,代表JSP頁(yè)面本身,可以通過(guò)它訪問(wèn)JSP頁(yè)面的屬性和方法。
  • exception,當(dāng)JSP頁(yè)面發(fā)生異常時(shí),該對(duì)象會(huì)被自動(dòng)設(shè)置為拋出的異常對(duì)象,允許在JSP頁(yè)面中處理異常。

9.jsp 有哪些動(dòng)作?作用分別是什么?

在JSP(Java Server Pages)中,動(dòng)作(Action)是一種特殊的標(biāo)簽,用于執(zhí)行特定的操作,比如轉(zhuǎn)發(fā)請(qǐng)求、包含文件、設(shè)置屬性等。

  • include 動(dòng)作,將其他JSP或HTML頁(yè)面的內(nèi)容嵌入到當(dāng)前JSP頁(yè)面中,使得頁(yè)面可以動(dòng)態(tài)包含其他頁(yè)面的內(nèi)容。
  • forward 動(dòng)作,將請(qǐng)求轉(zhuǎn)發(fā)到其他資源,比如轉(zhuǎn)發(fā)到另一個(gè)JSP頁(yè)面或Servlet,這樣可以共享請(qǐng)求屬性,并且URL會(huì)改變。
  • param 動(dòng)作,用于設(shè)置請(qǐng)求參數(shù),可以將參數(shù)添加到包含或轉(zhuǎn)發(fā)的請(qǐng)求中。
  • setProperty 動(dòng)作,用于設(shè)置JavaBean屬性。
  • getProperty 動(dòng)作,用于獲取JavaBean的屬性值。
  • useBean 動(dòng)作,用于實(shí)例化JavaBean,如果JavaBean不存在則創(chuàng)建,存在則不創(chuàng)建。
  • plugin 動(dòng)作,用于包含插件,一般用于內(nèi)嵌多媒體對(duì)象。
  • jsp:element 動(dòng)作,在JSP頁(yè)面中生成XML元素。
  • jsp:attribute 動(dòng)作,定義自定義標(biāo)簽的屬性,并為屬性設(shè)置默認(rèn)值。
  • jsp:body 動(dòng)作,在自定義標(biāo)簽中定義標(biāo)簽體的內(nèi)容。

這些動(dòng)作能夠在JSP頁(yè)面中實(shí)現(xiàn)各種功能,如包含內(nèi)容、轉(zhuǎn)發(fā)請(qǐng)求、操作JavaBean等。它們使JSP頁(yè)面能夠更加靈活和強(qiáng)大。

10.JSP 中動(dòng)態(tài) INCLUDE 與靜態(tài) INCLUDE 的區(qū)別?

(1)動(dòng)態(tài) include:

  • 動(dòng)態(tài) include 是通過(guò) jsp:include 動(dòng)作實(shí)現(xiàn)的,可以在運(yùn)行時(shí)動(dòng)態(tài)地包含另一個(gè) JSP 頁(yè)面或 Servlet 的輸出。
  • 可以根據(jù)特定的條件或邏輯來(lái)決定包含哪個(gè)頁(yè)面,也可以在循環(huán)中動(dòng)態(tài)包含不同的頁(yè)面。
  • 使用 jsp:include 標(biāo)簽,例如:<jsp:include page="included.jsp"/>

(2)靜態(tài) include:

  • 靜態(tài) include 是在編譯時(shí)將指定的 JSP 頁(yè)面或 HTML 文件合并到當(dāng)前 JSP 頁(yè)面中,形成一個(gè)單一的頁(yè)面。
  • 在 JSP 頁(yè)面執(zhí)行之前,包含的內(nèi)容已經(jīng)靜態(tài)地合并到當(dāng)前頁(yè)面中了。
  • 使用 <%@ include file="included.jsp" %> 語(yǔ)法,其中 file 屬性指定要包含的文件。

動(dòng)態(tài) include 是在運(yùn)行時(shí)進(jìn)行包含,可以動(dòng)態(tài)決定包含哪個(gè)頁(yè)面,而靜態(tài) include 是在編譯時(shí)靜態(tài)地將指定文件的內(nèi)容合并到當(dāng)前頁(yè)面中,運(yùn)行時(shí)無(wú)法改變包含的內(nèi)容。具體使用時(shí)需要根據(jù)實(shí)際場(chǎng)景來(lái)選擇使用動(dòng)態(tài) include 還是靜態(tài) include。

11.jsp 和 servlet 有什么區(qū)別?

Servlet是用Java編寫(xiě)的服務(wù)器端程序,它的主要功能是處理客戶端的請(qǐng)求并生成動(dòng)態(tài)Web內(nèi)容。Servlet是Java Web應(yīng)用的基礎(chǔ),負(fù)責(zé)接收請(qǐng)求、處理請(qǐng)求、生成響應(yīng)。

JSP本質(zhì)上是一種特殊的Servlet,它允許開(kāi)發(fā)者在HTML頁(yè)面中直接嵌入Java代碼片段(scriptlets)、JSP動(dòng)作、JSP指令以及表達(dá)式等,以生成動(dòng)態(tài)Web頁(yè)面。JSP的主要目的是使開(kāi)發(fā)者能夠更容易地創(chuàng)建動(dòng)態(tài)Web頁(yè)面,而無(wú)需編寫(xiě)大量的Java代碼。

12.說(shuō)一下 jsp 的 4 種作用域?

(1)Page作用域

最窄的作用域,它僅限于當(dāng)前的JSP頁(yè)面。當(dāng)頁(yè)面處理完成后,存儲(chǔ)在page作用域中的任何數(shù)據(jù)都將被丟棄。此作用域通常用于存儲(chǔ)僅在當(dāng)前頁(yè)面中使用的臨時(shí)變量。

(2)Request作用域

這個(gè)作用域涵蓋了單個(gè)HTTP請(qǐng)求及其對(duì)應(yīng)的響應(yīng)。在此作用域中定義的任何數(shù)據(jù)都可以在同一請(qǐng)求中的多個(gè)頁(yè)面之間共享,但當(dāng)請(qǐng)求處理完畢后,這些數(shù)據(jù)就會(huì)失效。這適用于跨多個(gè)JSP頁(yè)面?zhèn)鬟f數(shù)據(jù)的情況。

(3)Session作用域

此作用域與特定的用戶會(huì)話相關(guān)聯(lián)。在一個(gè)用戶訪問(wèn)網(wǎng)站期間,該用戶的所有請(qǐng)求都可以訪問(wèn)session作用域中的數(shù)據(jù)。當(dāng)用戶離開(kāi)網(wǎng)站或會(huì)話超時(shí),session中的數(shù)據(jù)才會(huì)被清除。這通常用于存儲(chǔ)需要跟蹤用戶狀態(tài)的信息,比如購(gòu)物車(chē)內(nèi)容或者登錄信息。

(4)Application作用域

最寬泛的作用域,它適用于整個(gè)Web應(yīng)用程序。在此作用域中聲明的數(shù)據(jù)對(duì)所有用戶和所有請(qǐng)求都是可見(jiàn)的,并且在整個(gè)應(yīng)用程序的生命周期內(nèi)都有效。常用于存儲(chǔ)應(yīng)用程序級(jí)別的信息,例如配置參數(shù)或統(tǒng)計(jì)信息。

13.session 和 cookie 有什么區(qū)別?

Session和Cookie的主要區(qū)別在于存儲(chǔ)位置、存儲(chǔ)容量以及存儲(chǔ)有效期。

  • 存儲(chǔ)位置:Cookie數(shù)據(jù)信息存放在客戶端瀏覽器中,而Session的數(shù)據(jù)信息存放在服務(wù)器上。
  • 存儲(chǔ)容量:Cookie的存儲(chǔ)容量較小,一般不超過(guò)4KB,而Session的存儲(chǔ)容量理論上沒(méi)有限制,但為了服務(wù)器性能考慮,通常不會(huì)存放過(guò)多數(shù)據(jù)。
  • 存儲(chǔ)有效期:Cookie可以設(shè)置為長(zhǎng)時(shí)間保持,甚至可以設(shè)置到期時(shí)間來(lái)實(shí)現(xiàn)長(zhǎng)期存儲(chǔ),而Session的失效時(shí)間通常較短,一般為會(huì)話結(jié)束或?yàn)g覽器關(guān)閉時(shí)失效。

14.如果客戶端禁止 cookie 能實(shí)現(xiàn) session 還能用嗎?

一般默認(rèn)情況下,在會(huì)話中,服務(wù)器存儲(chǔ) session 的 sessionid 是通過(guò) cookie 存到瀏覽器里。

如果瀏覽器禁用了 cookie,瀏覽器請(qǐng)求服務(wù)器無(wú)法攜帶 sessionid,服務(wù)器無(wú)法識(shí)別請(qǐng)求中的用戶身份,session失效。

但是可以通過(guò)其他方法在禁用 cookie 的情況下,可以繼續(xù)使用session。

  • 通過(guò)url重寫(xiě),把 sessionid 作為參數(shù)追加的原 url 中,后續(xù)的瀏覽器與服務(wù)器交互中攜帶 sessionid 參數(shù)。
  • 服務(wù)器的返回?cái)?shù)據(jù)中包含 sessionid,瀏覽器發(fā)送請(qǐng)求時(shí),攜帶 sessionid 參數(shù)。
  • 通過(guò) Http 協(xié)議其他 header 字段,服務(wù)器每次返回時(shí)設(shè)置該 header 字段信息,瀏覽器中 js 讀取該 header 字段,請(qǐng)求服務(wù)器時(shí),js設(shè)置攜帶該 header 字段。

15.Token、Cookie、Session的區(qū)別?

Token 是一種用于認(rèn)證和授權(quán)的令牌,通常由服務(wù)器生成并發(fā)送給客戶端??蛻舳嗽谑盏?Token 后,將其存儲(chǔ)在本地,然后在每次需要進(jìn)行身份驗(yàn)證或授權(quán)時(shí)使用該 Token。常見(jiàn)的 Token 包括 JWT (JSON Web Token) 和 OAuth Token。Token 在客戶端和服務(wù)器之間進(jìn)行持久性的認(rèn)證和授權(quán),通常用于實(shí)現(xiàn)跨域身份驗(yàn)證。

Cookie 是一種在客戶端中存儲(chǔ)的小型文本數(shù)據(jù),由服務(wù)器發(fā)送給客戶端,隨后在每次請(qǐng)求中通過(guò) HTTP 頭部發(fā)送回服務(wù)器。通常用于存儲(chǔ)用戶的身份驗(yàn)證信息、用戶設(shè)置、瀏覽歷史等。Cookie 是存儲(chǔ)在客戶端的,可以設(shè)置過(guò)期時(shí)間和路徑,不同頁(yè)面之間共享。

Session 是服務(wù)器端用于存儲(chǔ)用戶會(huì)話狀態(tài)的機(jī)制,通常使用 Session ID 來(lái)標(biāo)識(shí)用戶會(huì)話。當(dāng)用戶第一次訪問(wèn)服務(wù)器時(shí),服務(wù)器會(huì)為其創(chuàng)建一個(gè) session,然后將 session ID 存儲(chǔ)在 cookie 或者 URL 中,用于在該用戶的后續(xù)請(qǐng)求中進(jìn)行身份驗(yàn)證和狀態(tài)管理。Session 數(shù)據(jù)存儲(chǔ)在服務(wù)器端,相對(duì)于 Cookie 更安全、更難被篡改,但也需要服務(wù)器維護(hù)和消耗更多的資源。

16.說(shuō)一下 session 的工作原理?

  • 客戶端發(fā)送請(qǐng)求:當(dāng)用戶發(fā)送請(qǐng)求到服務(wù)器時(shí),服務(wù)器會(huì)為該用戶創(chuàng)建一個(gè)唯一識(shí)別的 session ID,并將其返回給客戶端,在 HTTP Response Header 中可以使用 Set-Cookie 來(lái)設(shè)置這個(gè) session ID。通常情況下,這個(gè) session ID 會(huì)以一個(gè)名為 "JSESSIONID" 的 Cookie 存儲(chǔ)在客戶端。
  • 服務(wù)器端存儲(chǔ)會(huì)話數(shù)據(jù):當(dāng)服務(wù)器收到客戶端的請(qǐng)求時(shí),會(huì)檢查請(qǐng)求中是否包含有效的 session ID。如果存在有效的 session ID,服務(wù)器就會(huì)使用這個(gè) session ID 來(lái)獲取對(duì)應(yīng)的會(huì)話數(shù)據(jù)。如果沒(méi)有有效的 session ID,服務(wù)器會(huì)創(chuàng)建一個(gè)新的 session,并為其分配一個(gè)新的 session ID。服務(wù)器端會(huì)針對(duì)每個(gè) session ID 維護(hù)一個(gè)對(duì)應(yīng)的會(huì)話數(shù)據(jù)存儲(chǔ),可以存儲(chǔ)用戶的身份驗(yàn)證信息、用戶設(shè)置、購(gòu)物車(chē)數(shù)據(jù)等用戶會(huì)話相關(guān)的信息。
  • 與客戶端交互:在處理完客戶端的請(qǐng)求后,服務(wù)器會(huì)將 session ID 返回給客戶端,在 HTTP Response Header 中使用 Set-Cookie。客戶端會(huì)存儲(chǔ)這個(gè) session ID,在后續(xù)的請(qǐng)求中將其包含在 HTTP 請(qǐng)求頭中,服務(wù)器通過(guò) session ID 來(lái)識(shí)別用戶,并獲取對(duì)應(yīng)的會(huì)話數(shù)據(jù)進(jìn)行處理。
  • 會(huì)話超時(shí)和銷(xiāo)毀:在一定的時(shí)間間隔后,若用戶沒(méi)有活動(dòng),服務(wù)器可能會(huì)認(rèn)為該會(huì)話已經(jīng)超時(shí)并銷(xiāo)毀會(huì)話數(shù)據(jù),釋放資源。這樣可以保證服務(wù)器的資源不會(huì)被無(wú)效的會(huì)話占用。

簡(jiǎn)而言之,Session 的工作原理是通過(guò)在服務(wù)器端創(chuàng)建、存儲(chǔ)和管理會(huì)話數(shù)據(jù),并通過(guò)在客戶端使用 session ID 進(jìn)行身份驗(yàn)證和狀態(tài)管理,實(shí)現(xiàn)用戶會(huì)話的跟蹤和狀態(tài)維護(hù)。

17.http 響應(yīng)碼 301 和 302 代表的是什么?有什么區(qū)別?

http 響應(yīng)碼 301:

  • 301表示請(qǐng)求的資源已經(jīng)永久移動(dòng)到了一個(gè)新的 URL 地址。
  • 當(dāng)服務(wù)器返回 301 狀態(tài)碼時(shí),它會(huì)在響應(yīng)頭中包含一個(gè) Location 屬性,客戶端會(huì)根據(jù)該屬性進(jìn)行重定向。
  • 客戶端在后續(xù)的請(qǐng)求中會(huì)直接請(qǐng)求新的 URL 地址。

http 響應(yīng)碼 302:

  • 302示請(qǐng)求的資源暫時(shí)性地移動(dòng)到了一個(gè)新的 URL 地址。
  • 客戶端會(huì)在收到響應(yīng)后根據(jù) Location 頭信息跳轉(zhuǎn)到新的 URL。但客戶端在后續(xù)的請(qǐng)求中會(huì)繼續(xù)請(qǐng)求原來(lái)的 URL 地址。
  • 302 響應(yīng)不會(huì)被瀏覽器緩存,每次請(qǐng)求時(shí)會(huì)重新執(zhí)行跳轉(zhuǎn)。

18.tomcat 如何調(diào)優(yōu)?

調(diào)整Tomcat的性能和優(yōu)化配置是提高Web應(yīng)用程序性能的重要步驟。

以下是一些優(yōu)化Tomcat的常見(jiàn)方法:

(1)調(diào)整內(nèi)存分配

將JVM最大堆大?。?Xmx)和初始堆大小(-Xms)設(shè)置為合適的值,以確保應(yīng)用程序運(yùn)行期間有足夠的內(nèi)存,一般建議堆的最大值設(shè)置為可用內(nèi)存的最大值的 80%。

調(diào)整新生代和老年代的比例,可以使用參數(shù) -XX:NewSize 和 -XX:MaxNewSize 調(diào)整新生代堆大小。

(2)調(diào)整線程池和連接池

配置Tomcat的連接和線程池大小,確保它能夠處理預(yù)期的并發(fā)請(qǐng)求,可以通過(guò)調(diào)整 maxThreads、minSpareThreads 和 maxConnections 等參數(shù)進(jìn)行配置。

使用合適的連接池,例如對(duì)于數(shù)據(jù)庫(kù)連接,可以使用連接池來(lái)管理連接,以提高性能和資源利用率。

(3)啟用壓縮

啟用Tomcat的壓縮功能,可以通過(guò)配置啟用GZIP壓縮,減小傳輸內(nèi)容的大小,提高性能。

(4)優(yōu)化靜態(tài)資源處理

使用獨(dú)立的Web服務(wù)器(如Nginx或Apache)作為前置服務(wù)器,處理靜態(tài)資源和緩存請(qǐng)求,減輕Tomcat服務(wù)器負(fù)擔(dān)。

針對(duì)Tomcat內(nèi)置的靜態(tài)資源緩存,可以通過(guò)配置添加Expires或Cache-Control響應(yīng)頭來(lái)緩存靜態(tài)資源。

(5)監(jiān)控和調(diào)整

使用監(jiān)控工具如JConsole、JVisualVM或者性能工具如VisualVM來(lái)監(jiān)控Tomcat性能,識(shí)別性能瓶頸并做相應(yīng)調(diào)整。

根據(jù)監(jiān)控結(jié)果,適時(shí)調(diào)整JVM和Tomcat的配置參數(shù),以優(yōu)化性能。

19.如何增加 tomcat 的連接數(shù)?

  • maxConnections參數(shù)決定了Tomcat能夠同時(shí)處理的最大連接數(shù)。在BIO模式下,默認(rèn)最大連接數(shù)是它的最大線程數(shù)(一般設(shè)置為200)。
  • maxThreads參數(shù)表示Tomcat接收客戶端請(qǐng)求的最大線程數(shù),即同時(shí)處理任務(wù)的個(gè)數(shù)。在高并發(fā)的I/O密集型應(yīng)用中,這個(gè)值可以設(shè)置為1000左右以提升處理能力。
  • 使用NIO模式,因?yàn)镹IO是非阻塞的IO,可以提高Tomcat在高并發(fā)環(huán)境下的性能。
  • 調(diào)整acceptCount,當(dāng)線程數(shù)量達(dá)到maxThreads設(shè)置的值時(shí),acceptCount決定了所能接受的最大排隊(duì)數(shù)量,超過(guò)這個(gè)值,新的請(qǐng)求會(huì)被拒絕。
  • 如果單個(gè)Tomcat實(shí)例無(wú)法滿足需求,可以考慮使用負(fù)載均衡器將流量分發(fā)到多個(gè)Tomcat實(shí)例。

20.如何增加Tomcat的內(nèi)存?

要增加 Tomcat 的內(nèi)存,你需要調(diào)整 Tomcat 運(yùn)行時(shí)的JVM參數(shù)。以下是一般步驟:

(1)找到 Tomcat 的啟動(dòng)腳本

Tomcat 的啟動(dòng)腳本通常位于 bin 目錄下,具體文件名可能是 catalina.sh (Linux) 或 catalina.bat (Windows)。

(2)編輯啟動(dòng)腳本,設(shè)置 JVM 參數(shù)

在啟動(dòng)腳本中找到 JAVA_OPTS 或 CATALINA_OPTS 變量,并增加 -Xmx 和 -Xms 參數(shù)來(lái)分別設(shè)置最大堆和初始堆大小。

示例:

CATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx1024m" 這將會(huì)將初始堆大小設(shè)置為512MB,最大堆大小設(shè)置為1024MB。你可以根據(jù)實(shí)際情況調(diào)整這些值。

(3)重啟 Tomcat 服務(wù)器

保存啟動(dòng)腳本并重啟 Tomcat 服務(wù)器,以應(yīng)用新的內(nèi)存設(shè)置。

21.Tomcat 有幾種部署方式?

① 將WAR包或文件夾直接放置到Tomcat的webapps目錄下,Tomcat會(huì)自動(dòng)解壓并部署項(xiàng)目,缺點(diǎn)是需要重啟項(xiàng)目。

② 不想放在webapps下,也可以在Tomcat的server.xml文件中配置標(biāo)簽,添加標(biāo)簽來(lái)指定項(xiàng)目的WAR包路徑。(一般采用①)。

③ 可以將Tomcat運(yùn)行在Docker容器中,通過(guò)Dockerfile或者docker-compose文件來(lái)管理和部署應(yīng)用程序。

④ 可以將 Tomcat 應(yīng)用部署到云服務(wù)提供商(如AWS、Azure、Google Cloud等)的云服務(wù)器上,實(shí)現(xiàn)靈活的彈性部署,按需分配資源。

責(zé)任編輯:姜華 來(lái)源: 哪吒編程
相關(guān)推薦

2024-04-15 08:34:43

2010-08-30 16:42:57

谷歌面試題

2016-03-03 10:07:39

ios內(nèi)存管理面試總結(jié)

2024-04-01 08:34:23

2024-04-09 08:32:58

Java面試題線程

2024-06-04 14:52:28

2021-03-19 11:08:27

開(kāi)發(fā)技能代碼

2014-07-28 14:00:40

linux面試題

2024-04-07 08:23:49

Java面試題集合框架

2010-11-26 10:53:29

戴爾

2021-02-23 12:43:39

Redis面試題緩存

2024-01-01 15:30:59

JavaScriptWeb 應(yīng)用程序開(kāi)發(fā)

2024-02-26 15:35:44

2017-11-06 13:02:37

前端setTimeout循環(huán)閉包

2017-12-14 08:04:21

Java面試程序

2018-06-28 09:34:26

架構(gòu)師Python面試題

2021-12-01 09:25:58

SQL數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)基礎(chǔ)

2024-10-11 17:09:27

2018-02-25 16:35:32

前端CSS面試題

2022-02-11 14:01:22

底層String字符串
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)