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

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

開(kāi)發(fā) 后端
Servlet 是 Java Web 應(yīng)用程序中處理客戶(hù)端請(qǐng)求并生成響應(yīng)的重要組件,它提供了一個(gè)在 Java Web 應(yīng)用程序中處理客戶(hù)端請(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)用程序中處理客戶(hù)端請(qǐng)求并生成響應(yīng)的重要組件,它的基本架構(gòu)可以分為以下幾個(gè)部分:

(1)Servlet 接口

Servlet 接口是所有 Servlet 類(lèi)必須實(shí)現(xiàn)的接口,它定義了處理客戶(hù)端請(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 名稱(chēng)、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é)處理客戶(hù)端請(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)與客戶(hù)端進(jìn)行通信。請(qǐng)求對(duì)象封裝了客戶(hù)端發(fā)送的請(qǐng)求信息,而響應(yīng)對(duì)象負(fù)責(zé)生成服務(wù)器返回的響應(yīng)內(nèi)容。

當(dāng)客戶(hù)端發(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ā)回客戶(hù)端。

這就是 Servlet 的基本架構(gòu),它提供了一個(gè)在 Java Web 應(yīng)用程序中處理客戶(hù)端請(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)客戶(hù)端的請(qǐng)求。當(dāng)客戶(hù)端發(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)處理客戶(hù)端的請(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è)接口,并且提供處理客戶(hù)端請(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

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

(4)HttpServletResponse

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

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

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

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

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

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() 方法用于獲取客戶(hù)端請(qǐng)求中的查詢(xún)參數(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ā)生變化,用戶(hù)無(wú)法感知到轉(zhuǎn)發(fā)過(guò)程。而redirect則是服務(wù)端通知客戶(hù)端進(jìn)行頁(yè)面跳轉(zhuǎn),客戶(hù)端會(huì)發(fā)起新的請(qǐng)求到指定的URL,因此瀏覽器地址欄會(huì)顯示新的地址。

forward通常用于需要根據(jù)用戶(hù)角色或其他條件來(lái)展示不同內(nèi)容的情況,比如登錄后根據(jù)用戶(hù)權(quán)限轉(zhuǎn)發(fā)到不同的管理頁(yè)面。而redirect則常用于需要用戶(hù)重新登錄或在完成某項(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)樯婕暗娇蛻?hù)端的多次請(qǐng)求和響應(yīng),所以效率相對(duì)較低。

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

  • request,客戶(hù)端的請(qǐng)求,用于獲取客戶(hù)端通過(guò)HTTP協(xié)議發(fā)送到服務(wù)器的數(shù)據(jù),包括請(qǐng)求頭、請(qǐng)求參數(shù)、請(qǐng)求方式等。
  • response,服務(wù)器的響應(yīng),用于向客戶(hù)端發(fā)送數(shù)據(jù),包括設(shè)置響應(yīng)頭、發(fā)送響應(yīng)體等。
  • out,用于向客戶(hù)端輸出內(nèi)容,是JSP頁(yè)面中的輸出流。
  • session,表示客戶(hù)端與服務(wù)器之間的一次會(huì)話(huà),用于保存用戶(hù)的狀態(tài)信息,如用戶(hù)登錄信息、購(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ù)器端程序,它的主要功能是處理客戶(hù)端的請(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作用域

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

(4)Application作用域

最寬泛的作用域,它適用于整個(gè)Web應(yīng)用程序。在此作用域中聲明的數(shù)據(jù)對(duì)所有用戶(hù)和所有請(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ù)信息存放在客戶(hù)端瀏覽器中,而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ì)話(huà)結(jié)束或?yàn)g覽器關(guān)閉時(shí)失效。

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

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

如果瀏覽器禁用了 cookie,瀏覽器請(qǐng)求服務(wù)器無(wú)法攜帶 sessionid,服務(wù)器無(wú)法識(shí)別請(qǐng)求中的用戶(hù)身份,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ā)送給客戶(hù)端??蛻?hù)端在收到 Token 后,將其存儲(chǔ)在本地,然后在每次需要進(jìn)行身份驗(yàn)證或授權(quán)時(shí)使用該 Token。常見(jiàn)的 Token 包括 JWT (JSON Web Token) 和 OAuth Token。Token 在客戶(hù)端和服務(wù)器之間進(jìn)行持久性的認(rèn)證和授權(quán),通常用于實(shí)現(xiàn)跨域身份驗(yàn)證。

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

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

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

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

簡(jiǎn)而言之,Session 的工作原理是通過(guò)在服務(wù)器端創(chuàng)建、存儲(chǔ)和管理會(huì)話(huà)數(shù)據(jù),并通過(guò)在客戶(hù)端使用 session ID 進(jìn)行身份驗(yàn)證和狀態(tài)管理,實(shí)現(xiàn)用戶(hù)會(huì)話(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 屬性,客戶(hù)端會(huì)根據(jù)該屬性進(jìn)行重定向。
  • 客戶(hù)端在后續(xù)的請(qǐng)求中會(huì)直接請(qǐng)求新的 URL 地址。

http 響應(yīng)碼 302:

  • 302示請(qǐng)求的資源暫時(shí)性地移動(dòng)到了一個(gè)新的 URL 地址。
  • 客戶(hù)端會(huì)在收到響應(yīng)后根據(jù) Location 頭信息跳轉(zhuǎn)到新的 URL。但客戶(hù)端在后續(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)整線(xiàn)程池和連接池

配置Tomcat的連接和線(xiàn)程池大小,確保它能夠處理預(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ù),以?xún)?yōu)化性能。

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

  • maxConnections參數(shù)決定了Tomcat能夠同時(shí)處理的最大連接數(shù)。在BIO模式下,默認(rèn)最大連接數(shù)是它的最大線(xiàn)程數(shù)(一般設(shè)置為200)。
  • maxThreads參數(shù)表示Tomcat接收客戶(hù)端請(qǐng)求的最大線(xiàn)程數(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)線(xiàn)程數(shù)量達(dá)到maxThreads設(shè)置的值時(shí),acceptCount決定了所能接受的最大排隊(duì)數(shù)量,超過(guò)這個(gè)值,新的請(qǐng)求會(huì)被拒絕。
  • 如果單個(gè)Tomcat實(shí)例無(wú)法滿(mǎn)足需求,可以考慮使用負(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面試題線(xiàn)程

2021-03-19 11:08:27

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

2024-06-04 14:52:28

2024-04-07 08:23:49

Java面試題集合框架

2014-07-28 14:00:40

linux面試題

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ā)

2017-12-14 08:04:21

Java面試程序

2024-02-26 15:35:44

2017-11-06 13:02:37

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

2018-06-28 09:34:26

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

2021-12-01 09:25:58

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

2025-08-22 10:45:57

Go字符串語(yǔ)言

2022-02-11 14:01:22

底層String字符串

2018-02-25 16:35:32

前端CSS面試題
點(diǎn)贊
收藏

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