Java經(jīng)典面試題匯總:Java Web
1. JSP 和 servlet 有什么區(qū)別?
JSP 是 servlet 技術(shù)的擴(kuò)展,本質(zhì)上就是 servlet 的簡(jiǎn)易方式。servlet 和 JSP 最主要的不同點(diǎn)在于, servlet 的應(yīng)用邏輯是在 Java 文件中,并且完全從表示層中的 html 里分離開(kāi)來(lái),而 JSP 的情況是 Java 和 html 可以組合成一個(gè)擴(kuò)展名為 JSP 的文件。JSP 側(cè)重于視圖,servlet 主要用于控制邏輯。
2. 什么是Tomcat?
Tomcat是一個(gè)免費(fèi)的Web應(yīng)用服務(wù)器,Java編寫(xiě)的Web項(xiàng)目可以部署在上面,用戶(hù)在客戶(hù)端請(qǐng)求時(shí),都是將請(qǐng)求發(fā)到Tomcat上,Tomcat在將請(qǐng)求發(fā)到對(duì)應(yīng)的項(xiàng)目上。
3. Tomcat容器是如何創(chuàng)建Servlet類(lèi)實(shí)例?用到了什么原理?
當(dāng)容器啟動(dòng)時(shí),會(huì)讀取在webapps目錄下所有的web應(yīng)用中的web.xml文件,然后對(duì)xml文件進(jìn)行解析,并讀取servlet注冊(cè)信息。然后,將每個(gè)應(yīng)用中注冊(cè)的servlet類(lèi)都進(jìn)行加載,并通過(guò)反射的方式實(shí)例化。(有時(shí)候也是在第一次請(qǐng)求時(shí)實(shí)例化)在servlet注冊(cè)時(shí)加上1如果為正數(shù),則在一開(kāi)始就實(shí)例化,如果不寫(xiě)或?yàn)樨?fù)數(shù),則第一次請(qǐng)求實(shí)例化。
4. 攔截器和過(guò)濾器的區(qū)別?
- 攔截器是基于java的反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)。
- 攔截器不依賴(lài)與servlet容器,過(guò)濾器依賴(lài)與servlet容器。
- 攔截器只能對(duì)action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有的請(qǐng)求起作用。
- 攔截器可以訪問(wèn)action上下文、值棧里的對(duì)象,而過(guò)濾器不能訪問(wèn)。
- 在action的生命周期中,攔截器可以多次被調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次。
5.說(shuō)一下 JSP 的 4 種作用域?
- page:代表與一個(gè)頁(yè)面相關(guān)的對(duì)象和屬性。
- request:代表與客戶(hù)端發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性。一個(gè)請(qǐng)求可能跨越多個(gè)頁(yè)面,涉及多個(gè) Web 組件;需要在頁(yè)面顯示的臨時(shí)數(shù)據(jù)可以置于此作用域。
- session:代表與某個(gè)用戶(hù)與服務(wù)器建立的一次會(huì)話(huà)相關(guān)的對(duì)象和屬性。跟某個(gè)用戶(hù)相關(guān)的數(shù)據(jù)應(yīng)該放在用戶(hù)自己的 session 中。
- application:代表與整個(gè) Web 應(yīng)用程序相關(guān)的對(duì)象和屬性,它實(shí)質(zhì)上是跨越整個(gè) Web 應(yīng)用程序,包括多個(gè)頁(yè)面、請(qǐng)求和會(huì)話(huà)的一個(gè)全局作用域。
6. JSP 有哪些內(nèi)置對(duì)象?作用分別是什么?
JSP 有 9 大內(nèi)置對(duì)象:
- request:封裝客戶(hù)端的請(qǐng)求,其中包含來(lái)自 get 或 post 請(qǐng)求的參數(shù);
- response:封裝服務(wù)器對(duì)客戶(hù)端的響應(yīng);
- pageContext:通過(guò)該對(duì)象可以獲取其他對(duì)象;
- session:封裝用戶(hù)會(huì)話(huà)的對(duì)象;
- application:封裝服務(wù)器運(yùn)行環(huán)境的對(duì)象;
- out:輸出服務(wù)器響應(yīng)的輸出流對(duì)象;
- config:Web 應(yīng)用的配置對(duì)象;
- page:JSP 頁(yè)面本身(相當(dāng)于 Java 程序中的 this);
- exception:封裝頁(yè)面拋出異常的對(duì)象。
7. Servlet的生命周期
servlet有良好的生存期的定義,包括加載和實(shí)例化、初始化、處理請(qǐng)求以及服務(wù)結(jié)束。這個(gè)生存期由javax.servlet.servlet接口中的init、service、destroy方法表達(dá)。
(1)加載和實(shí)例化
當(dāng)Servlet容器啟動(dòng)或客戶(hù)端發(fā)送一個(gè)請(qǐng)求時(shí),Servlet容器會(huì)查找內(nèi)存中是否存在該Servlet實(shí)例,若存在,則直接讀取該實(shí)例響應(yīng)請(qǐng)求;如果不存在,就創(chuàng)建一個(gè)Servlet實(shí)例。
(2) 初始化
實(shí)例化后,Servlet容器將調(diào)用Servlet的init()方法進(jìn)行初始化(一些準(zhǔn)備工作或資源預(yù)加載工作)。
(3)服務(wù)
初始化后,Servlet處于能響應(yīng)請(qǐng)求的就緒狀態(tài)。當(dāng)接收到客戶(hù)端請(qǐng)求時(shí),調(diào)用service()的方法處理客戶(hù)端請(qǐng)求,HttpServlet的service()方法會(huì)根據(jù)不同的請(qǐng)求 轉(zhuǎn)調(diào)不同的doXxx()方法。
(4)銷(xiāo)毀
當(dāng)Servlet容器關(guān)閉時(shí),Servlet實(shí)例也隨時(shí)銷(xiāo)毀。其間,Servlet容器會(huì)調(diào)用Servlet 的destroy()方法去判斷該Servlet是否應(yīng)當(dāng)被釋放(或回收資源)。
8. session 和 cookie 有什么區(qū)別?
- 存儲(chǔ)位置不同:session 存儲(chǔ)在服務(wù)器端;cookie 存儲(chǔ)在瀏覽器端。
- 安全性不同:cookie 安全性一般,在瀏覽器存儲(chǔ),可以被偽造和修改。
- 容量和個(gè)數(shù)限制:cookie 有容量限制,每個(gè)站點(diǎn)下的 cookie 也有個(gè)數(shù)限制。
- 存儲(chǔ)的多樣性:session 可以存儲(chǔ)在 Redis 中、數(shù)據(jù)庫(kù)中、應(yīng)用程序中;而 cookie 只能存儲(chǔ)在瀏覽器中。
9. 說(shuō)一下 session 的工作原理?
session 的工作原理是客戶(hù)端登錄完成之后,服務(wù)器會(huì)創(chuàng)建對(duì)應(yīng)的 session,session 創(chuàng)建完之后, 會(huì)把 session 的 id 發(fā)送給客戶(hù)端,客戶(hù)端再存儲(chǔ)到瀏覽器中。這樣客戶(hù)端每次訪問(wèn)服務(wù)器時(shí),都會(huì)帶著 sessionid, 服務(wù)器拿到 sessionid 之后,在內(nèi)存找到與之對(duì)應(yīng)的 session 這樣就可以正常工作了。
10. 如果客戶(hù)端禁止 cookie 能實(shí)現(xiàn) session 還能用嗎?
可以用,session 只是依賴(lài) cookie 存儲(chǔ) sessionid,如果 cookie 被禁用了, 可以使用 url 中添加 sessionid 的方式保證 session 能正常使用。
11. JSP工作原理?
(1)當(dāng)用戶(hù)訪問(wèn)一個(gè)JSP頁(yè)面時(shí),會(huì)向一個(gè)Servlet容器(Tomcat)發(fā)出請(qǐng)求;
(2)如果是第一次請(qǐng)求頁(yè)面,或頁(yè)面有所改動(dòng),則servlet容器首先要把JSP頁(yè)面(假設(shè)為test.jsp)轉(zhuǎn)化為Servlet代碼(test.java),再將其轉(zhuǎn)化為(test.class文件);因?yàn)檫@個(gè)過(guò)程(編譯)會(huì)耗費(fèi)一定時(shí)間,所以第一次訪問(wèn)或jsp文件有改動(dòng)時(shí),訪問(wèn)時(shí)間有些長(zhǎng);
(3)JSP容器負(fù)責(zé)調(diào)用從JSP轉(zhuǎn)換來(lái)的servlet,這些servlet負(fù)責(zé)提供服務(wù)相應(yīng)用戶(hù)請(qǐng)求(比如客戶(hù)端發(fā)送表單,要求servlet:formprocessor.java來(lái)處理,則容器會(huì)建立一個(gè)線(xiàn)程,調(diào)用formprocessor.java來(lái)處理該請(qǐng)求);如果用戶(hù)有多個(gè)請(qǐng)求,則容器會(huì)建立多個(gè)線(xiàn)程處理多個(gè)請(qǐng)求;
(4)容器執(zhí)行字節(jié)碼文件(包括調(diào)用的servlet:formprocessor.java字節(jié)嗎),并將其結(jié)果返回到客戶(hù)端;(返回的最終方式是由servlet輸出html格式的文件流)
12. JSP中動(dòng)態(tài)include和靜態(tài)include的區(qū)別?
- 靜態(tài)include:語(yǔ)法:<%@ include file="文件名" %>,相當(dāng)于復(fù)制,編輯時(shí)將對(duì)應(yīng)的文件包含進(jìn)來(lái),當(dāng)內(nèi)容變化時(shí),不會(huì)再一次對(duì)其編譯,不易維護(hù)。
- 動(dòng)態(tài)include:語(yǔ)法:<jsp:include page="文件名">,能夠自動(dòng)檢查被包含文件,當(dāng)客戶(hù)端對(duì)JSP文件進(jìn)行請(qǐng)求時(shí),會(huì)重新將對(duì)應(yīng)的文件包含進(jìn)來(lái),進(jìn)行實(shí)時(shí)的更新。
13、JSTL是什么??jī)?yōu)點(diǎn)有哪些?
答:JSTL(JSP Standard Tag Library,JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù))是一個(gè)不斷完善的開(kāi)放源代碼的JSP標(biāo)簽庫(kù),由四個(gè)定制標(biāo)記庫(kù)(core、format、xml、sql)和一對(duì)通用標(biāo)記庫(kù)驗(yàn)證器(ScriptFreeTLV和PermittedTaglibsTLV)組成。
優(yōu)點(diǎn)有:
- 在應(yīng)用程序服務(wù)器之間提供了一致的接口,最大程度的提高了web應(yīng)用在各應(yīng)用服務(wù)器之間的移植。
- 簡(jiǎn)化了JSP和web應(yīng)用程序的開(kāi)發(fā)。
- 以一種統(tǒng)一的方式減少了JSP中scriptlet代碼數(shù)據(jù),可以達(dá)到?jīng)]有任何scriptlet代碼的代碼。在我們公司的項(xiàng)目中是不允許任何scriptlet出現(xiàn)在JSP中。
- 允許JSP設(shè)計(jì)工具與web應(yīng)用程序開(kāi)發(fā)的進(jìn)一步集成。相信不久就會(huì)有支持JSTL的IDE開(kāi)發(fā)工具出現(xiàn)。
14. GET和POST的區(qū)別?
POST和GET都是向服務(wù)器提交數(shù)據(jù),并且都會(huì)從服務(wù)器獲取數(shù)據(jù)。
1、傳送方式:get通過(guò)地址欄傳輸,post通過(guò)報(bào)文傳輸。
2、傳送長(zhǎng)度:get參數(shù)有長(zhǎng)度限制(受限于url長(zhǎng)度),而post無(wú)限制
3、GET和POST還有一個(gè)重大區(qū)別,簡(jiǎn)單的說(shuō):
GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包
長(zhǎng)的說(shuō):
對(duì)于GET方式的請(qǐng)求,瀏覽器會(huì)把http header和data一并發(fā)送出去,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù));
而對(duì)于POST,瀏覽器先發(fā)送header,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回?cái)?shù)據(jù))。
建議:
1、get方式的安全性較Post方式要差些,包含機(jī)密信息的話(huà),建議用Post數(shù)據(jù)提交方式;
2、在做數(shù)據(jù)查詢(xún)時(shí),建議用Get方式;而在做數(shù)據(jù)添加、修改或刪除時(shí),建議用Post方式;
15. 什么是 XSS 攻擊,如何避免?
XSS 攻擊:即跨站腳本攻擊,它是 Web 程序中常見(jiàn)的漏洞。原理是攻擊者往 Web 頁(yè)面里插入惡意的腳本代碼(css 代碼、Javascript 代碼等),當(dāng)用戶(hù)瀏覽該頁(yè)面時(shí),嵌入其中的腳本代碼會(huì)被執(zhí)行,從而達(dá)到惡意攻擊用戶(hù)的目的,如盜取用戶(hù) cookie、破壞頁(yè)面結(jié)構(gòu)、重定向到其他網(wǎng)站等。 預(yù)防 XSS 的核心是必須對(duì)輸入的數(shù)據(jù)做過(guò)濾處理。
16. 什么是 CSRF 攻擊,如何避免?
CSRF:Cross-Site Request Forgery(中文:跨站請(qǐng)求偽造),可以理解為攻擊者盜用了你的身份,以你的名義發(fā)送惡意請(qǐng)求,比如:以你名義發(fā)送郵件、發(fā)消息、購(gòu)買(mǎi)商品,虛擬貨幣轉(zhuǎn)賬等。 防御手段: 驗(yàn)證請(qǐng)求來(lái)源地址; 關(guān)鍵操作添加驗(yàn)證碼; 在請(qǐng)求地址添加 token 并驗(yàn)證。
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot項(xiàng)目開(kāi)發(fā)中常用的依賴(lài)
這篇文章主要介紹了SpringBoot項(xiàng)目開(kāi)發(fā)中常用的依賴(lài)詳解,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Java的Flowable工作流之加簽轉(zhuǎn)簽詳解
這篇文章主要介紹了Java的Flowable工作流之加簽轉(zhuǎn)簽詳解,Flowable是一個(gè)開(kāi)源的工作流引擎,它提供了一套強(qiáng)大的工具和功能,用于設(shè)計(jì)、執(zhí)行和管理各種類(lèi)型的工作流程,需要的朋友可以參考下2023-11-11SpringBoot自動(dòng)裝配Import示例詳解
SpringBoot中@Import注解的使用可以幫助開(kāi)發(fā)者將指定的Bean或配置類(lèi)導(dǎo)入到IOC容器中,該注解支持四種用法:導(dǎo)入Bean、導(dǎo)入配置類(lèi)、實(shí)現(xiàn)ImportSelector接口和實(shí)現(xiàn),感興趣的朋友一起看看吧2024-09-09java?kafka如何動(dòng)態(tài)設(shè)置用戶(hù)讀寫(xiě)權(quán)限
這篇文章主要介紹了java?kafka如何動(dòng)態(tài)設(shè)置用戶(hù)讀寫(xiě)權(quán)限問(wèn)題,具有很好的參考家價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08基于redis setIfAbsent的使用說(shuō)明
這篇文章主要介紹了基于redis setIfAbsent的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01