57. 什么是反射?
反射是在運行狀態中,對於任意一個類,都能夠知道該類的所有屬性和方法,對於任意一個對象,都能夠獲得該對象的任一屬性和方法;這種動態獲取信息以及動態調用對象的方法的功能稱之為Java語言的反射機制。
58. 什么是 Java 序列化?什么情況下需要序列化?
Java序列化是為了保存各種對象在內存中的狀態,並且可以把保存的對象狀態再讀出來。
以下情況需要使用Java序列化:
- 想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;
- 想用套接字在網絡上傳送對象的時候;
- 想通過RMI(遠程方法調用)傳輸對象的時候。
59. 動態代理是什么?有哪些應用?
動態代理是運行時動態生成代理類。
動態代理的應用有 spring aop、hibernate 數據查詢、測試框架的后端 mock、rpc,Java注解對象獲取等。
60. 怎么實現動態代理?
JDK原生動態代理和cglib動態代理。JDK原生動態代理是基於接口實現的,而cglib是基於繼承當前類的子類實現的。
61. 為什么要使用克隆?
克隆的對象可能包含一些已經修改過的屬性,而new出來的對象屬性都還是初始化時候的值,所以當需要一個新的對象來保存當前對象的“狀態”就需要使用克隆方法了。
62. 如何實現對象克隆?
- 實現 Cloneable 接口並重寫Object類中的clone() 方法。
- 實現 Serializable 接口,通過對象的序列化和反序列化來實現克隆,可以實現真正的深度克隆。
63. 深拷貝和淺拷貝區別是什么?
- 淺克隆:當對象被復制時只復制它本身和其中包含的值類型的成員變量,而引用類型的成員對象並沒有被復制。
- 深克隆:除了對象本身被復制外,對象所包含的所有成員變量也將被復制。
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 並驗證。
