10道不得不會的 JavaEE 面試題
我是 JavaPub,專注於面試、副業,技術人的成長記錄。
以下是 JavaEE 面試題,相信大家都會有種及眼熟又陌生的感覺、看過可能在短暫的面試後又馬上忘記了。JavaPub在這裡整理這些容易忘記的重點知識及解答,建議收藏,經常溫習查閱
。
評論區見
JavaEE
本系列《最少必要面試題》
目前很多新專案很少會用到JavaEE的技術棧,但是對於部分維護老程式碼的工程師來說,還是尤為重要。
1. JSP 有哪些內建物件?作用分別是什麼?
JSP有9個內建物件:
-
request:封裝客戶端的請求,其中包含來自GET或POST請求的引數;
-
response:封裝伺服器對客戶端的響應;
-
pageContext:通過該物件可以獲取其他物件;
-
session:封裝使用者會話的物件;
-
application:封裝伺服器執行環境的物件;
-
out:輸出伺服器響應的輸出流物件;
-
config:web應用的配置物件;
-
page:jsp頁面本身(相當於Java程式中的this);
-
exception:封裝頁面丟擲異常的物件。
2. 介紹一下 Servlet 生命週期
Servlet是執行在伺服器端,以多執行緒的方式處理客戶端請求的小程式。是sun公司提供的一套規範(規範的實現是介面)。
servlet的生命週期就是從servlet出現到消亡(銷燬)的全過程。主要分為以下幾個階段:
載入類—>例項化(為物件分配空間)—>初始化(為物件的屬性賦值)—>請求響應(服務階段)—>銷燬
詳細介紹:
- 載入
在下列時刻會載入Servlet(只執行一次):
- 如果已經配置自動載入選項,則在啟動伺服器時自動載入web.xml檔案中設定的
; - 伺服器啟動之後,客戶機首次向Servlet發出請求時會載入;
- 重新載入Servlet時會進行一次載入;
- 例項化
載入Servlet後,伺服器建立一個Servlet例項。(只執行一次)
- 初始化
- 呼叫 Servlet 的
init()
方法。在初始化階段,Servlet 初始化引數被傳遞給 Servlet 配置物件 ServletConfig。(只執行一次);
- 請求處理
對於到達伺服器的客戶機請求,伺服器建立針對此次請求的一個"請求物件"和一個"響應物件"。
伺服器呼叫 Servlet 的 service()
方法,該方法用於傳遞"請求"和"響應"物件。
service()
方法從"請求"物件獲得請求資訊、處理該請求並用"響應"物件的方法將響應回傳給客戶端。
service()
方法可以呼叫其他方法來處理請求,例如 doGet()、doPost()
或其他方法。
- 銷燬
當伺服器不需要 Servlet,或重新裝入 Servlet 的新例項時,伺服器會呼叫 Servlet 的 destroy()
方法。(只執行一次);
3. Servlet和JSP的區別和聯絡
區別:
-
JSP是在HTML程式碼裡面寫Java程式碼;而Servlet是在Java程式碼中寫HTML程式碼,Servlet本身是個Java類;
-
JSP使人們將顯示和邏輯分隔稱為可能,這意味著兩者的開發可以並行進行;而Servlet並沒有將兩者分開;
-
Servlet獨立地處理靜態表示邏輯與動態業務邏輯,任何檔案的變動都需要對此服務程式重新編譯;JSP允許使用特殊標籤直接嵌入到HTML頁面,HTML內容與JAVA內容也可放在單獨檔案中,HTML內容的任何變動會自動編譯裝入到服務程式;
-
Servlet需要在web.xml中配置;而JSP無需配置;
-
目前JSP主要用在檢視層,負責顯示;而Servlet主要用在控制層,負責排程;
聯絡:
-
都是SUN公司推出的動態網頁技術;
-
先有Servlet,針對Servlet缺點推出JSP。JSP是Servlet的一種特殊形式,每個JSP頁面就是一個Servlet例項,JSP頁面由系統翻譯成Servlet,Servlet再負責響應使用者的請求。
4. JSP的執行過程
在JSP執行過程中,首先由客戶端發出請求,Web伺服器接收到請求之後,如果是第一次訪問某個JSP頁面,Web伺服器對它進行一下三個操作:
- 翻譯
由.jsp變為.java,由JSP引擎完成。
- 編譯
由.java變為.class,由Java編譯器實現。
- 執行
由.class變為.html,用Java虛擬機器執行編譯檔案,然後將執行結果返回給Web伺服器,並最終返回給客戶端。
如果不是第一次訪問某個JSP頁面,則只執行第三步,所以第一次訪問JSP較慢。
5. Session和Cookie的區別和聯絡;說明在自己專案中如何使用?
Session 和 Cookie 都是會話(Seesion)跟蹤技術。Cookie 通過在客戶端記錄資訊確定使用者身份,Session 通過在伺服器端記錄資訊確定使用者身份。但是 Session 的實現依賴於 Cookie,sessionId(session的唯一標識需要存放在客戶端).
-
cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。
-
cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。
-
session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,考慮到減輕伺服器效能方面,應當使用cookie。
-
單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。
-
可以考慮將登入資訊等重要資訊存放為session,其他資訊如果需要保留,可以放在cookie中。
-
在程式開發過程中,我們可以在客戶端每次與伺服器互動時檢查SessionID(Session中屬性值,非HttpServlet環境開發中也可以用其它的Key值代替),用於會話管理。
-
將登陸資訊等重要資訊存放為SESSION
-
其他資訊如果需要保留,可以放在COOKIE中,比如購物車
購物車最好使用cookie,但是cookie是可以在客戶端禁用的,這時候我們要使用cookie+資料庫的方式實現,當從cookie中不能取出資料時,就從資料庫獲取。
6. 轉發和重定向的聯絡和區別?
-
轉發:伺服器端的跳轉,路徑不會發生改變(針對的是servlet),是伺服器內部的處理,一次請求,請求物件不會變
-
重定向:客戶端的跳轉,路徑會發生改變,將要請求的路徑和302重定向的狀態碼發給客戶端瀏覽器,客戶端瀏覽器將再次向伺服器發出請求,不是同個請求,兩次請求。
7. 攔截器和過濾器的區別
Spring 的攔截器與 Servlet 的 Filter 有相似之處,比如二者都是AOP程式設計思想的體現,都能實現許可權檢查、日誌記錄等。不同的是:
-
使用範圍不同: Filter 是 Servlet 規範規定的,只能用於Web程式中。而攔截器既可以用於Web程式,也可以用於 Application、Swing程式中。
-
規範不同: Filter 是在 Servlet 規範中定義的,是 Servlet 容器支援的。而攔截器是在 Spring 容器內的,是 Spring 框架支援的。
-
使用的資源不同:同其他的程式碼塊一樣,攔截器也是一個 Spring 的元件,歸 Spring 管理,配置在 Spring 檔案中,因此能使用 Spring 裡的任何資源、物件,例如 Service 物件、資料來源、事務管理等,通過 IoC 注入到攔截器即可;而Filter則不能。
-
深度不同: Filter 在只在 Servlet 前後起作用。而攔截器能夠深入到方法前後、異常丟擲前後等,因此攔截器的使用具有更大的彈性。所以在 Spring 構架的程式中,要優先使用攔截器。
一張經典的圖
8. 三次握手和四次揮手
這裡是字面描述
三次握手:
-
客戶端向伺服器發出連線請求等待伺服器確認
-
伺服器向客戶端返回一個響應告訴客戶端收到了請求
-
客戶端向伺服器再次發出確認資訊,此時連線建立
四次揮手:
-
客戶端向伺服器發出取消連線請求
-
伺服器向客戶端返回一個響應,表示收到客戶端取消請求
-
伺服器向客戶端發出確認取消資訊(向客戶端表明可以取消連線了)
-
客戶端再次傳送確認訊息,此時連線取消
9. TCP和UDP的區別
-
TCP :面向連線,UDP :面向無連線
-
TCP :傳輸效率低,UDP :傳輸效率高(有大小限制,一次限定在64kb之內)
-
TCP:可靠,UDP :不可靠
10. 如何解決跨域問題?
跨域指的是瀏覽器不能執行其它網站的指令碼,它是由瀏覽器的同源策略造成的,是瀏覽器對 JavaScript 施加的安全限制。
所謂同源指的是:協議、域名、埠號都相同,只要有一個不相同,那麼都是非同源。
解決方案:
-
使用 ajax 的 jsonp。(這一點有些人是不知道的)
-
nginx 轉發:利用 nginx 反向代理,將請求分發到部署相應專案的 tomcat 伺服器,當然也不存在跨域問題。
-
使用 CORS:寫一個配置類實現 WebMvcConfigurer 介面或者配置 FilterRegistrationBean。
CORS(Cross-Origin Resource Sharing)是一個W3C標準,全稱“跨域資源共享”
11. 什麼是 CSRF 攻擊?如何防禦CSRF 攻擊
CSRF(Cross-site request forgery) 跨站請求偽造。CSRF 攻擊是在受害者毫不知情的情況下,以受害者名義偽造請求傳送給受攻擊站點,從而在受害者並未授權的情況下執行受害者許可權下的各種操作。
CSRF 攻擊專門針對狀態改變請求,而不是資料竊取,因為攻擊者無法檢視對偽造請求的響應。
目前防禦 CSRF 攻擊主要有三種策略:
-
驗證 HTTP Referer 欄位
-
在請求地址中新增 token 並驗證
-
在 HTTP 頭中自定義屬性並驗證
12. HTTP1.0和HTTP1.1和HTTP2.0的區別
-
HTTP1.0 :無狀態,無連線。
-
HTTP1.1 :長連線,請求管道化,增加快取處理,增加 Host 欄位,支援斷點傳輸。
-
HTTP2.0 :二進位制分幀,多路複用(連線共享),頭部壓縮,伺服器推送。
低谷蓄力
《最少必要面試題》