1. 程式人生 > 其它 >Java 面試題-WEB、網路程式設計、設計模式

Java 面試題-WEB、網路程式設計、設計模式

1.JSP 和 servlet 有什麼區別?

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

2.JSP 有哪些內建物件?作用分別是什麼?

JSP 有 9 大內建物件:

  • request:封裝客戶端的請求,其中包含來自 get 或 post 請求的引數;
  • response:封裝伺服器對客戶端的響應;
  • pageContext:通過該物件可以獲取其他物件;
  • session:封裝使用者會話的物件;
  • application:封裝伺服器執行環境的物件;
  • out:輸出伺服器響應的輸出流物件;
  • config:Web 應用的配置物件;
  • page:JSP 頁面本身(相當於 Java 程式中的 this);
  • exception:封裝頁面丟擲異常的物件。
3.說一下 JSP 的 4 種作用域?
  • page:代表與一個頁面相關的物件和屬性。
  • request:代表與客戶端發出的一個請求相關的物件和屬性。一個請求可能跨越多個頁面,涉及多個 Web 元件;需要在頁面顯示的臨時資料可以置於此作用域。
  • session:代表與某個使用者與伺服器建立的一次會話相關的物件和屬性。跟某個使用者相關的資料應該放在使用者自己的 session 中。
  • application:代表與整個 Web 應用程式相關的物件和屬性,它實質上是跨越整個 Web 應用程式,包括多個頁面、請求和會話的一個全域性作用域。
  • 儲存位置不同:session 儲存在伺服器端;cookie 儲存在瀏覽器端。
  • 安全性不同:cookie 安全性一般,在瀏覽器儲存,可以被偽造和修改。
  • 容量和個數限制:cookie 有容量限制,每個站點下的 cookie 也有個數限制。
  • 儲存的多樣性:session 可以儲存在 Redis 中、資料庫中、應用程式中;而 cookie 只能儲存在瀏覽器中。
5.說一下 session 的工作原理?

    session 的工作原理是客戶端登入完成之後,伺服器會建立對應的 session,session 建立完之後,會把 session 的 id 傳送給客戶端,客戶端再儲存到瀏覽器中。這樣客戶端每次訪問伺服器時,都會帶著 sessionid,伺服器拿到 sessionid 之後,在記憶體找到與之對應的 session 這樣就可以正常工作了。

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

7.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 一般需要安裝外掛或者自己寫程式碼才行。
8.如何避免 SQL 注入?
  • 使用預處理 PreparedStatement。
  • 使用正則表示式過濾掉字元中的特殊字元。
9.什麼是 XSS 攻擊,如何避免?

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

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

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

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

    防禦手段:

  • 驗證請求來源地址;
  • 關鍵操作新增驗證碼;
  • 在請求地址新增 token 並驗證。
11.http 和 https 的區別?
  • http 的連線很簡單,是無狀態的;HTTPS 協議是由 SSL + HTTP 協議構建的可進行加密傳輸、身份認證的網路協議,比 http 協議要安全。
  • http 和 https 使用的埠也不一樣,前者是 80,後者是 443。
12.get 和 post 的區別?
  • 首先,get是從伺服器獲取資料,而post是向伺服器傳送資料。
  • get會將引數加入到表單的action所指的url中,資料在頁面的url中看得到;而post是將表單內容放在html header中,再傳送給action所指的url,使用者是看不到引數的。
  • get 請求引數長度有限制,而 post 沒有。
  • 所以,get的方式相比於post方式的安全性較低。
  • 但是,get的執行效率比post高。如果是查詢資料的話,建議使用get,而增刪改建議使用post方式。
13.forward 和 redirect 的區別?

    forward 是轉發,而 redirect 是重定向:

  • 位址列 URL 顯示:forward url 不會發生改變,而 redirect url 會發生改變;
  • 資料共享:forward 可以共享 request 裡的資料,redirect 不能共享;
  • 效率:forward 比 redirect 效率高;
14.Servlet 是什麼?

    Servlet(Server Applet),全程 Java Servlet,未有中文譯文。是用於 Java 編寫的伺服器端程式。其主要功能在於互動式地瀏覽和修改資料,生成動態 Web 內容。

    狹義的 Servlet 是指 Java 語言實現的一個介面,廣義的 servlet 是指任何實現了這個 Servlet 介面的類,一般情況下,人們將 Servlet 理解為後者。

15.Servlet 的生命週期是怎樣的?
  • Servlet 初始化後呼叫 init () 方法。
  • Servlet 呼叫 service() 方法來處理客戶端的請求。
  • Servlet 銷燬前呼叫 destroy() 方法。
  • 最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。
16.Servlet 是執行緒安全的麼?

    不是執行緒安全的,儘量不要定義全域性變數。

17.Servlet 支援非同步處理嗎?

    Servlet3支援非同步處理。

18.Servlet 是單例還是多例?
  • 如果一個 Servlet 沒有被部署在分散式環境中,一般 web.xml 中宣告的一個 Servlet 只對應一個例項。
  • 而如果一個 Servlet 實現了 SingleThreadModel 介面,就會被初始化多個例項。
19.如何實現隱藏的表單域?
<input type="hidden" name="java" value="..."/>
20.AJAX 應用和傳統 Web 應用有什麼不同?

    AJAX 可以實現非同步區域性頁面重新整理,而傳統 Web 應用只能同步重新整理整個頁面。

21.怎麼優化 Web 前端的效能?
  • 1.HTML CSS JS 位置
    一般需要將 CSS 放頁面最上面,即 HEAD 部分,而將 JS 程式碼放頁面底部。
  • 2.引用檔案位置
    儘量把遠端引用的資源本地化。
  • 3.減少後臺請求
    每個請求都是耗費資源影響系統性能的,所以能減少後臺請求就減少
  • 4.壓縮傳輸
    http 壓縮可以對純文字可以壓縮至原內容的 40%,從而節省了 60% 的資料傳輸。
  • 5.減少 cookie 傳輸
    cookie 會包含在每次請求和響應中,如果cookie 過多會影響 http 相應速度。
  • 6.瀏覽器快取
    高併發情況下,可以將一些不怎麼變動的東西快取到瀏覽器 cache 中。
  • 7.CDN
    CDN 是一個靜態內容分發網路,本質就是靜態資源的快取,可以將靜態資源放到 CDN上。
  • 8.反向代理
    常用的反向代理 nginx 除了負載均衡功能,它也可以通過配置快取功能來加速請求響應速度。
22.攔截器和過濾器的區別?
  • 攔截器是基於java的反射機制的,而過濾器是基於函式回撥。
  • 攔截器不依賴bai與servlet容器,過濾器依賴與servlet容器。
  • 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
  • 攔截器可以訪問action上下文、值棧裡的物件,而過濾器不能訪問。
  • 在action的生命週期中,攔截器可以多次被呼叫,而過濾器只能在容器初始化時被呼叫一次。
23.什麼是跨域?有哪些解決方案?

    當一個請求 url 的協議、域名、埠三者之間任意一個與當前頁面 url 不同即為跨域。
實現跨域有一下幾種方案:

  • 伺服器端執行跨域 設定 CORS 等於 *;
  • 在單個介面使用註解 @CrossOrigin 執行跨域;
  • 使用 jsonp 跨域;
24.http 響應碼 301 和 302 代表的是什麼?有什麼區別?

    301:永久重定向。
    302:暫時重定向。

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

25.簡述 tcp 和 udp的區別?

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

    兩者的區別大致如下:

  • tcp 面向連線,udp 面向非連線即傳送資料前不需要建立連結;
  • tcp 提供可靠的服務(資料傳輸),udp 無法保證;
  • tcp 面向位元組流,udp 面向報文;
  • tcp 資料傳輸慢,udp 資料傳輸快;
26.tcp 為什麼要三次握手,兩次不行嗎?為什麼?

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

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

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

  • 傳送端粘包:傳送端需要等緩衝區滿才傳送出去,造成粘包;
  • 接收方粘包:接收方不及時接收緩衝區的包,造成多個包接收。
28.OSI 的七層模型都有哪些?
  • 物理層:利用傳輸介質為資料鏈路層提供物理連線,實現位元流的透明傳輸。
  • 資料鏈路層:負責建立和管理節點間的鏈路。
  • 網路層:通過路由選擇演算法,為報文或分組通過通訊子網選擇最適當的路徑。
  • 傳輸層:向用戶提供可靠的端到端的差錯和流量控制,保證報文的正確傳輸。
  • 會話層:向兩個實體的表示層提供建立和使用連線的方法。
  • 表示層:處理使用者資訊的表示問題,如編碼、資料格式轉換和加密解密等。
  • 應用層:直接向用戶提供服務,完成使用者希望在網路上完成的各種工作。
29.說一下你熟悉的設計模式?
  • 單例模式:保證被建立一次,節省系統開銷。
  • 工廠模式(簡單工廠、抽象工廠):解耦程式碼。
  • 觀察者模式:定義了物件之間的一對多的依賴,這樣一來,當一個物件改變時,它的所有的依賴者都會收到通知並自動更新。
  • 外觀模式:提供一個統一的介面,用來訪問子系統中的一群介面,外觀定義了一個高層的介面,讓子系統更容易使用。
  • 模版方法模式:定義了一個演算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的步驟。
  • 狀態模式:允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。
  • 代理模式:提供了對目標物件另外的訪問方式;即通過代理物件訪問目標物件.這樣做的好處是:可以在目標物件實現的基礎上,增強額外的功能操作,即擴充套件目標物件的功能。
  • 策略模式:策略模式的用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立類中,從而使得它們可以相互替換。
30.簡單工廠和抽象工廠有什麼區別?
  • 簡單工廠:用來生產同一等級結構中的任意產品,對於增加新的產品,無能為力。
  • 工廠方法:用來生產同一等級結構中的固定產品,支援增加任意產品。
  • 抽象工廠:用來生產不同產品族的全部產品,對於增加新的產品,無能為力;支援增加產品族。