10道不得不會的JavaEE面試題

JavaPub發表於2022-07-05

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:封裝頁面丟擲異常的物件。

JSP的9內建物件及其含義

2. 介紹一下 Servlet 生命週期

Servlet是執行在伺服器端,以多執行緒的方式處理客戶端請求的小程式。是sun公司提供的一套規範(規範的實現是介面)。

servlet的生命週期就是從servlet出現到消亡(銷燬)的全過程。主要分為以下幾個階段:

載入類—>例項化(為物件分配空間)—>初始化(為物件的屬性賦值)—>請求響應(服務階段)—>銷燬

詳細介紹:

  1. 載入

在下列時刻會載入Servlet(只執行一次):

  • 如果已經配置自動載入選項,則在啟動伺服器時自動載入web.xml檔案中設定的
  • 伺服器啟動之後,客戶機首次向Servlet發出請求時會載入;
  • 重新載入Servlet時會進行一次載入;
  1. 例項化

載入Servlet後,伺服器建立一個Servlet例項。(只執行一次)

  1. 初始化
  • 呼叫 Servlet 的 init() 方法。在初始化階段,Servlet 初始化引數被傳遞給 Servlet 配置物件 ServletConfig。(只執行一次);
  1. 請求處理

對於到達伺服器的客戶機請求,伺服器建立針對此次請求的一個"請求物件"和一個"響應物件"。

伺服器呼叫 Servlet 的 service() 方法,該方法用於傳遞"請求"和"響應"物件。

service() 方法從"請求"物件獲得請求資訊、處理該請求並用"響應"物件的方法將響應回傳給客戶端。

service() 方法可以呼叫其他方法來處理請求,例如 doGet()、doPost() 或其他方法。

  1. 銷燬

當伺服器不需要 Servlet,或重新裝入 Servlet 的新例項時,伺服器會呼叫 Servlet 的 destroy() 方法。(只執行一次);

3. Servlet和JSP的區別和聯絡

區別:

  1. JSP是在HTML程式碼裡面寫Java程式碼;而Servlet是在Java程式碼中寫HTML程式碼,Servlet本身是個Java類;

  2. JSP使人們將顯示和邏輯分隔稱為可能,這意味著兩者的開發可以並行進行;而Servlet並沒有將兩者分開;

  3. Servlet獨立地處理靜態表示邏輯與動態業務邏輯,任何檔案的變動都需要對此服務程式重新編譯;JSP允許使用特殊標籤直接嵌入到HTML頁面,HTML內容與JAVA內容也可放在單獨檔案中,HTML內容的任何變動會自動編譯裝入到服務程式;

  4. Servlet需要在web.xml中配置;而JSP無需配置;

  5. 目前JSP主要用在檢視層,負責顯示;而Servlet主要用在控制層,負責排程;

聯絡:

  1. 都是SUN公司推出的動態網頁技術;

  2. 先有Servlet,針對Servlet缺點推出JSP。JSP是Servlet的一種特殊形式,每個JSP頁面就是一個Servlet例項,JSP頁面由系統翻譯成Servlet,Servlet再負責響應使用者的請求。

4. JSP的執行過程

在JSP執行過程中,首先由客戶端發出請求,Web伺服器接收到請求之後,如果是第一次訪問某個JSP頁面,Web伺服器對它進行一下三個操作:

  1. 翻譯

由.jsp變為.java,由JSP引擎完成。

  1. 編譯

由.java變為.class,由Java編譯器實現。

  1. 執行

由.class變為.html,用Java虛擬機器執行編譯檔案,然後將執行結果返回給Web伺服器,並最終返回給客戶端。

如果不是第一次訪問某個JSP頁面,則只執行第三步,所以第一次訪問JSP較慢

5. Session和Cookie的區別和聯絡;說明在自己專案中如何使用?

Session 和 Cookie 都是會話(Seesion)跟蹤技術。Cookie 通過在客戶端記錄資訊確定使用者身份,Session 通過在伺服器端記錄資訊確定使用者身份。但是 Session 的實現依賴於 Cookie,sessionId(session的唯一標識需要存放在客戶端).

  1. cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。

  2. cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。

  3. session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,考慮到減輕伺服器效能方面,應當使用cookie。

  4. 單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。

  5. 可以考慮將登入資訊等重要資訊存放為session,其他資訊如果需要保留,可以放在cookie中。

  6. 在程式開發過程中,我們可以在客戶端每次與伺服器互動時檢查SessionID(Session中屬性值,非HttpServlet環境開發中也可以用其它的Key值代替),用於會話管理。

  • 將登陸資訊等重要資訊存放為SESSION

  • 其他資訊如果需要保留,可以放在COOKIE中,比如購物車

    購物車最好使用cookie,但是cookie是可以在客戶端禁用的,這時候我們要使用cookie+資料庫的方式實現,當從cookie中不能取出資料時,就從資料庫獲取。

6. 轉發和重定向的聯絡和區別?

  • 轉發:伺服器端的跳轉,路徑不會發生改變(針對的是servlet),是伺服器內部的處理,一次請求,請求物件不會變

  • 重定向:客戶端的跳轉,路徑會發生改變,將要請求的路徑和302重定向的狀態碼發給客戶端瀏覽器,客戶端瀏覽器將再次向伺服器發出請求,不是同個請求,兩次請求。

7. 攔截器和過濾器的區別

Spring 的攔截器與 Servlet 的 Filter 有相似之處,比如二者都是AOP程式設計思想的體現,都能實現許可權檢查、日誌記錄等。不同的是:

  1. 使用範圍不同: Filter 是 Servlet 規範規定的,只能用於Web程式中。而攔截器既可以用於Web程式,也可以用於 Application、Swing程式中。

  2. 規範不同: Filter 是在 Servlet 規範中定義的,是 Servlet 容器支援的。而攔截器是在 Spring 容器內的,是 Spring 框架支援的。

  3. 使用的資源不同:同其他的程式碼塊一樣,攔截器也是一個 Spring 的元件,歸 Spring 管理,配置在 Spring 檔案中,因此能使用 Spring 裡的任何資源、物件,例如 Service 物件、資料來源、事務管理等,通過 IoC 注入到攔截器即可;而Filter則不能。

  4. 深度不同: Filter 在只在 Servlet 前後起作用。而攔截器能夠深入到方法前後、異常丟擲前後等,因此攔截器的使用具有更大的彈性。所以在 Spring 構架的程式中,要優先使用攔截器。

一張經典的圖

過濾器&攔截器

8. 三次握手和四次揮手

這裡是字面描述

三次握手:

  1. 客戶端向伺服器發出連線請求等待伺服器確認

  2. 伺服器向客戶端返回一個響應告訴客戶端收到了請求

  3. 客戶端向伺服器再次發出確認資訊,此時連線建立

四次揮手:

  1. 客戶端向伺服器發出取消連線請求

  2. 伺服器向客戶端返回一個響應,表示收到客戶端取消請求

  3. 伺服器向客戶端發出確認取消資訊(向客戶端表明可以取消連線了)

  4. 客戶端再次傳送確認訊息,此時連線取消

9. TCP和UDP的區別

  1. TCP :面向連線,UDP :面向無連線

  2. TCP :傳輸效率低,UDP :傳輸效率高(有大小限制,一次限定在64kb之內)

  3. TCP:可靠,UDP :不可靠

10. 如何解決跨域問題?

跨域指的是瀏覽器不能執行其它網站的指令碼,它是由瀏覽器的同源策略造成的,是瀏覽器對 JavaScript 施加的安全限制。

所謂同源指的是:協議、域名、埠號都相同,只要有一個不相同,那麼都是非同源。

解決方案:

  1. 使用 ajax 的 jsonp。(這一點有些人是不知道的)

  2. nginx 轉發:利用 nginx 反向代理,將請求分發到部署相應專案的 tomcat 伺服器,當然也不存在跨域問題。

  3. 使用 CORS:寫一個配置類實現 WebMvcConfigurer 介面或者配置 FilterRegistrationBean。

CORS(Cross-Origin Resource Sharing)是一個W3C標準,全稱“跨域資源共享”

11. 什麼是 CSRF 攻擊?如何防禦CSRF 攻擊

CSRF(Cross-site request forgery) 跨站請求偽造。CSRF 攻擊是在受害者毫不知情的情況下,以受害者名義偽造請求傳送給受攻擊站點,從而在受害者並未授權的情況下執行受害者許可權下的各種操作。

CSRF 攻擊專門針對狀態改變請求,而不是資料竊取,因為攻擊者無法檢視對偽造請求的響應。

目前防禦 CSRF 攻擊主要有三種策略:

  1. 驗證 HTTP Referer 欄位

  2. 在請求地址中新增 token 並驗證

  3. 在 HTTP 頭中自定義屬性並驗證

12. HTTP1.0和HTTP1.1和HTTP2.0的區別

  1. HTTP1.0 :無狀態,無連線。

  2. HTTP1.1 :長連線,請求管道化,增加快取處理,增加 Host 欄位,支援斷點傳輸。

  3. HTTP2.0 :二進位制分幀,多路複用(連線共享),頭部壓縮,伺服器推送。

低谷蓄力

《最少必要面試題》

10道不得不會的Java基礎面試題

10道不得不會的Java併發基礎面試題

10道不得不會的JVM面試題

10道不得不會的MySQL基礎面試題

10道不得不會的MyBatis面試題

10道不得不會的Spring面試題

10道不得不會的ElasticSearch面試題

10道不得不會的Redis面試題

10道不得不會的Kafka面試題

10道不得不會的Zookeeper面試題

10道不得不會的Docker面試題

10道不得不會的JavaEE面試題

相關文章