Java面試題總結 - 【第二章】JavaWeb+設計模式篇

前言

本專題,承接上一專題Java面試題總結 - 【第一章】Java基礎篇

Java Web

64. JSP 和 servlet 有什麼區別?

JSP 是 servlet 技術的擴展,本質上就是 servlet 的簡易方式。servlet 和 JSP 最主要的不同點在於,servlet 的應用邏輯是在 Java 文件中,並且完全從表示層中的 html 裏分離開來,而 JSP 的情況是 Java 和 html 可以組合成一個擴展名爲 JSP 的文件。JSP 側重於視圖,servlet 主要用於控制邏輯。

65. JSP 有哪些內置對象?作用分別是什麼?

JSP 有 9 大內置對象:

  • request:封裝客戶端的請求,其中包含來自 get 或 post 請求的參數;
  • response:封裝服務器對客戶端的響應;
  • pageContext:通過該對象可以獲取其他對象;
  • session:封裝用戶會話的對象;
  • application:封裝服務器運行環境的對象;
  • out:輸出服務器響應的輸出流對象;
  • config:Web 應用的配置對象;
  • page:JSP 頁面本身(相當於 Java 程序中的 this);
  • exception:封裝頁面拋出異常的對象。

66. 說一下 JSP 的 4 種作用域?

  • page:代表與一個頁面相關的對象和屬性。
  • request:代表與客戶端發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個 Web 組件;需要在頁面顯示的臨時數據可以置於此作用域。
  • session:代表與某個用戶與服務器建立的一次會話相關的對象和屬性。跟某個用戶相關的數據應該放在用戶自己的 session 中。
  • application:代表與整個 Web 應用程序相關的對象和屬性,它實質上是跨越整個 Web 應用程序,包括多個頁面、請求和會話的一個全局作用域。

67. session 和 cookie 有什麼區別?

  • 存儲位置不同:session 存儲在服務器端;cookie 存儲在瀏覽器端。
  • 安全性不同:cookie 安全性一般,在瀏覽器存儲,可以被僞造和修改。
  • 容量和個數限制:cookie 有容量限制,每個站點下的 cookie 也有個數限制。
  • 存儲的多樣性:session 可以存儲在 Redis 中、數據庫中、應用程序中;而 cookie 只能存儲在瀏覽器中。

68. 說一下 session 的工作原理?

session 的工作原理是客戶端登錄完成之後,服務器會創建對應的 session,session 創建完之後,會把 session 的 id 發送給客戶端,客戶端再存儲到瀏覽器中。這樣客戶端每次訪問服務器時,都會帶着 sessionid,服務器拿到 sessionid 之後,在內存找到與之對應的 session 這樣就可以正常工作了。

69. 如果客戶端禁止 cookie 能實現 session 還能用嗎?

可以用,session 只是依賴 cookie 存儲 sessionid,如果 cookie 被禁用了,可以使用 url 中添加 sessionid 的方式保證 session 能正常使用。

70. spring mvc 和 struts 的區別是什麼?

  • 攔截級別:struts2 是類級別的攔截;spring mvc 是方法級別的攔截。
  • 數據獨立性:spring mvc 的方法之間基本上獨立的,獨享 request 和 response 數據,請求數據通過參數獲取,處理結果通過 ModelMap 交回給框架,方法之間不共享變量;而 struts2 雖然方法之間也是獨立的,但其所有 action 變量是共享的,這不會影響程序運行,卻給我們編碼和讀程序時帶來了一定的麻煩。
  • 攔截機制:struts2 有以自己的 interceptor 機制,spring mvc 用的是獨立的 aop 方式,這樣導致struts2 的配置文件量比 spring mvc 大。
  • 對 ajax 的支持:spring mvc 集成了ajax,所有 ajax 使用很方便,只需要一個註解 @ResponseBody 就可以實現了;而 struts2 一般需要安裝插件或者自己寫代碼才行。

71. 如何避免 SQL 注入?

  • 使用預處理 PreparedStatement。
  • 使用正則表達式過濾掉字符中的特殊字符。

72. 什麼是 XSS 攻擊,如何避免?

XSS 攻擊:即跨站腳本攻擊,它是 Web 程序中常見的漏洞。原理是攻擊者往 Web 頁面裏插入惡意的腳本代碼(css 代碼、Javascript 代碼等),當用戶瀏覽該頁面時,嵌入其中的腳本代碼會被執行,從而達到惡意攻擊用戶的目的,如盜取用戶 cookie、破壞頁面結構、重定向到其他網站等。

預防 XSS 的核心是必須對輸入的數據做過濾處理。

73. 什麼是 CSRF 攻擊,如何避免?

CSRF:Cross-Site Request Forgery(中文:跨站請求僞造),可以理解爲攻擊者盜用了你的身份,以你的名義發送惡意請求,比如:以你名義發送郵件、發消息、購買商品,虛擬貨幣轉賬等。

防禦手段:

  • 驗證請求來源地址;
  • 關鍵操作添加驗證碼;
  • 在請求地址添加 token 並驗證。

異常

74. throw 和 throws 的區別?

  • throw:是真實拋出一個異常。
  • throws:是聲明可能會拋出一個異常。

75. final、finally、finalize 有什麼區別?

  • final:是修飾符,如果修飾類,此類不能被繼承;如果修飾方法和變量,則表示此方法和此變量不能在被改變,只能使用。
  • finally:是 try{} catch{} finally{} 最後一部分,表示不論發生任何情況都會執行,finally 部分可以省略,但如果 finally 部分存在,則一定會執行 finally 裏面的代碼。
  • finalize: 是 Object 類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法。

76. try-catch-finally 中哪個部分可以省略?

try-catch-finally 其中 catch 和 finally 都可以被省略,但是不能同時省略,也就是說有 try 的時候,必須後面跟一個 catch 或者 finally。

77. try-catch-finally 中,如果 catch 中 return 了,finally 還會執行嗎?

finally 一定會執行,即使是 catch 中 return 了,catch 中的 return 會等 finally 中的代碼執行完之後,纔會執行。

78. 常見的異常類有哪些?

  • NullPointerException 空指針異常
  • ClassNotFoundException 指定類不存在
  • NumberFormatException 字符串轉換爲數字異常
  • IndexOutOfBoundsException 數組下標越界異常
  • ClassCastException 數據類型轉換異常
  • FileNotFoundException 文件未找到異常
  • NoSuchMethodException 方法不存在異常
  • IOException IO 異常
  • SocketException Socket 異常

網絡

79. http 響應碼 301 和 302 代表的是什麼?有什麼區別?

301:永久重定向。

302:暫時重定向。

它們的區別是,301 對搜索引擎優化(SEO)更加有利;302 有被提示爲網絡攔截的風險。

80. forward 和 redirect 的區別?

forward 是轉發 和 redirect 是重定向:

  • 地址欄 url 顯示:foward url 不會發生改變,redirect url 會發生改變;
  • 數據共享:forward 可以共享 request 裏的數據,redirect 不能共享;
  • 效率:forward 比 redirect 效率高。

81. 簡述 tcp 和 udp的區別?

tcp 和 udp 是 OSI 模型中的運輸層中的協議。tcp 提供可靠的通信傳輸,而 udp 則常被用於讓廣播和細節控制交給應用的通信傳輸。

兩者的區別大致如下:

  • tcp 面向連接,udp 面向非連接即發送數據前不需要建立鏈接;
  • tcp 提供可靠的服務(數據傳輸),udp 無法保證;
  • tcp 面向字節流,udp 面向報文;
  • tcp 數據傳輸慢,udp 數據傳輸快;

82. tcp 爲什麼要三次握手,兩次不行嗎?爲什麼?

如果採用兩次握手,那麼只要服務器發出確認數據包就會建立連接,但由於客戶端此時並未響應服務器端的請求,那此時服務器端就會一直在等待客戶端,這樣服務器端就白白浪費了一定的資源。若採用三次握手,服務器端沒有收到來自客戶端的再此確認,則就會知道客戶端並沒有要求建立請求,就不會浪費服務器的資源。

83. 說一下 tcp 粘包是怎麼產生的?

tcp 粘包可能發生在發送端或者接收端,分別來看兩端各種產生粘包的原因:

  • 發送端粘包:發送端需要等緩衝區滿才發送出去,造成粘包;
  • 接收方粘包:接收方不及時接收緩衝區的包,造成多個包接收。

84. OSI 的七層模型都有哪些?

  • 物理層:利用傳輸介質爲數據鏈路層提供物理連接,實現比特流的透明傳輸。
  • 數據鏈路層:負責建立和管理節點間的鏈路。
  • 網絡層:通過路由選擇算法,爲報文或分組通過通信子網選擇最適當的路徑。
  • 傳輸層:向用戶提供可靠的端到端的差錯和流量控制,保證報文的正確傳輸。
  • 會話層:向兩個實體的表示層提供建立和使用連接的方法。
  • 表示層:處理用戶信息的表示問題,如編碼、數據格式轉換和加密解密等。
  • 應用層:直接向用戶提供服務,完成用戶希望在網絡上完成的各種工作。

85. get 和 post 請求有哪些區別?

  • get 請求會被瀏覽器主動緩存,而 post 不會。
  • get 傳遞參數有大小限制,而 post 沒有。
  • post 參數傳輸更安全,get 的參數會明文限制在 url 上,post 不會。

86. 如何實現跨域?

實現跨域有以下幾種方案:

  • 服務器端運行跨域 設置 CORS 等於 *;
  • 在單個接口使用註解 @CrossOrigin 運行跨域;
  • 使用 jsonp 跨域;

87. 說一下 JSONP 實現原理?

jsonp:JSON with Padding,它是利用script標籤的 src 連接可以訪問不同源的特性,加載遠程返回的“JS 函數”來執行的。

設計模式

88. 說一下你熟悉的設計模式?

  • 單例模式:保證被創建一次,節省系統開銷。
  • 工廠模式(簡單工廠、抽象工廠):解耦代碼。
  • 觀察者模式:定義了對象之間的一對多的依賴,這樣一來,當一個對象改變時,它的所有的依賴者都會收到通知並自動更新。
  • 外觀模式:提供一個統一的接口,用來訪問子系統中的一羣接口,外觀定義了一個高層的接口,讓子系統更容易使用。
  • 模版方法模式:定義了一個算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以在不改變算法結構的情況下,重新定義算法的步驟。
  • 狀態模式:允許對象在內部狀態改變時改變它的行爲,對象看起來好像修改了它的類。

89. 簡單工廠和抽象工廠有什麼區別?

  • 簡單工廠:用來生產同一等級結構中的任意產品,對於增加新的產品,無能爲力。
  • 工廠方法:用來生產同一等級結構中的固定產品,支持增加任意產品。
  • 抽象工廠:用來生產不同產品族的全部產品,對於增加新的產品,無能爲力;支持增加產品族。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章