Java Web
1 http 的長連線和短連線
HTTP 協議有 HTTP/1.0 版本和 HTTP/1.1 版本。HTTP1.1 預設保持長連線(HTTP persistent connection,也翻譯為持久連線),資料傳輸完成了保持 TCP 連線不斷開(不發 RST 包、不四次握手),等待在同域名下繼續用這個通道傳輸資料;相反的就是短連線。
在 HTTP/1.0 中,預設使用的是短連線。也就是說,瀏覽器和伺服器每進行一次 HTTP 操作,就建立一次連線,任務結束就中斷連線。從 HTTP/1.1 起,預設使用的是長連線,用以保持連線特性。
2 http 常見的狀態碼有哪些?
200 OK //客戶端請求成功
301 Moved Permanently(永久移除),請求的 URL 已移走。Response 中應該包含一個 Location URL, 說明資源現在所處的位置
302 found 重定向
400 Bad Request //客戶端請求有語法錯誤,不能被伺服器所理解
403 Forbidden //伺服器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的 URL
500 Internal Server Error //伺服器發生不可預期的錯誤
503 Server Unavailable //伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常
3 GET 和POST 的區別?
(1)GET 請求的資料會附在URL 之後(就是把資料放置在 HTTP 協議頭中),以?分割URL 和傳輸資料,引數之間以&相連,如:login.action?name=zhagnsan&password=123456。POST 把提交的資料則放置在是 HTTP 包的包體中。
(2)GET 方式提交的資料最多隻能是 1024 位元組,理論上POST 沒有限制,可傳送大量的資料。其實這樣說是錯誤的,不準確的:“GET 方式提交的資料最多隻能是 1024 位元組”,因為 GET 是透過 URL 提交資料,那麼 GET 可提交的資料量就跟URL 的長度有直接關係了。而實際上,URL 不存在引數上限的問題,HTTP 協議規範沒有對 URL 長度進行限制。這個限制是特定的瀏覽器及伺服器對它的限制。IE 對URL 長度的限制是2083 位元組(2K+35)。對於其他瀏覽器,如Netscape、FireFox 等,理論上沒有長度限制,其限制取決於作業系統的支援。
(3)POST 的安全性要比GET 的安全性高。注意:這裡所說的安全性和上面 GET 提到的“安全”不是同個概念。上面“安全”的含義僅僅是不作資料修改,而這裡安全的含義是真正的 Security 的含義,比如:透過 GET 提交資料,使用者名稱和密碼將明文出現在 URL 上,因為(1)登入頁面有可能被瀏覽器快取,(2)其他人檢視瀏覽器的歷史記錄,那麼別人就可以拿到你的賬號和密碼了,除此之外,使用 GET 提交資料還可能會造成 Cross-site request forgery 攻擊。
Get 是向伺服器發索取資料的一種請求,而 Post 是向伺服器提交資料的一種請求,在 FORM(表單)中,Method
預設為”GET”,實質上,GET 和 POST 只是傳送機制不同,並不是一個取一個發!
4 Cookie 和Session 的區別
Cookie 是 web 伺服器傳送給瀏覽器的一塊資訊,瀏覽器會在本地一個檔案中給每個 web 伺服器儲存 cookie。以後瀏覽器再給特定的 web 伺服器傳送請求時,同時會發送所有為該伺服器儲存的 cookie。
Session 是儲存在 web 伺服器端的一塊資訊。session 物件儲存特定使用者會話所需的屬性及配置資訊。當用戶在應用程式的 Web 頁之間跳轉時,儲存在 Session 物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。
Cookie 和session 的不同點:
(1)無論客戶端做怎樣的設定,session 都能夠正常工作。當客戶端禁用 cookie 時將無法使用 cookie。
(2)在儲存的資料量方面:session 能夠儲存任意的java 物件,cookie 只能儲存 String 型別的物件。
5 在單點登入中,如果 cookie 被禁用了怎麼辦?
單點登入的原理是後端生成一個 session ID,然後設定到 cookie,後面的所有請求瀏覽器都會帶上 cookie, 然後服務端從 cookie 裡獲取 session ID,再查詢到使用者資訊。所以,保持登入的關鍵不是 cookie,而是透過cookie 儲存和傳輸的 session ID,其本質是能獲取使用者資訊的資料。除了 cookie,還通常使用 HTTP 請求頭來傳輸。但是這個請求頭瀏覽器不會像 cookie 一樣自動攜帶,需要手工處理。
6 什麼是jsp,什麼是Servlet?jsp 和Servlet 有什麼區別?
jsp 本質上就是一個Servlet,它是 Servlet 的一種特殊形式(由 SUN 公司推出),每個 jsp 頁面都是一個servlet例項。
Servlet 是由 Java 提供用於開發 web 伺服器應用程式的一個元件,執行在服務端,由 servlet 容器管理,用來生成動態內容。一個 servlet 例項是實現了特殊介面 Servlet 的 Java 類,所有自定義的 servlet 均必須實現 Servlet 介面。
區別:
jsp 是 html 頁面中內嵌的Java 程式碼,側重頁面顯示;
Servlet 是 html 程式碼和 Java 程式碼分離,側重邏輯控制,mvc 設計思想中jsp 位於檢視層,servlet 位於控制層
Jsp 執行機制:如下圖
JVM 只能識別 Java 類,並不能識別 jsp 程式碼!web 容器收到以.jsp 為副檔名的 url 請求時,會將訪問請求交給tomcat 中 jsp 引擎處理,每個 jsp 頁面第一次被訪問時,jsp 引擎將 jsp 程式碼解釋為一個 servlet 源程式,接著編譯servlet 源程式生成.class 檔案,在web 容器 servlet 引擎去裝載執行servlet 程式,實現頁面互動。
7 servlet生命週期
Servlet 載入—>例項化—>服務—>銷燬。
生命週期詳解:
init():
在Servlet的生命週期中,僅執行一次init()方法。它是在伺服器裝入Servlet時執行的,負責初始化Servlet物件。可以配置伺服器,以在啟動伺服器或客戶機首次訪問Servlet時裝入Servlet。無論有多少客戶機訪問Servlet,都不會重複執行init()。
service():
它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet物件,該物件的Service()方法就要呼叫,而且傳遞給這個方法一個“請求”(ServletRequest)物件和一個“響應”(ServletResponse)物件作為引數。在HttpServlet中已存在Service()方法。預設的服務功能是呼叫與HTTP請求的方法相應的do功能。
destroy():
僅執行一次,在伺服器端停止且解除安裝Servlet時執行該方法。當Servlet物件退出生命週期時,負責釋放佔用的資源。一個Servlet在執行service()方法時可能會產生其他的執行緒,因此需要確認在呼叫destroy()方法時,這些執行緒已經終止或完成。
如何與Tomcat 結合工作步驟:
(1)Web Client 向Servlet容器(Tomcat)發出Http請求
(2)Servlet容器接收Web Client的請求
(3)Servlet容器建立一個HttpRequest物件,將Web Client請求的資訊封裝到這個物件中。
(4)Servlet容器建立一個HttpResponse物件
(5)Servlet容器呼叫HttpServlet物件的service方法,把HttpRequest物件與HttpResponse物件作為引數傳給HttpServlet 物件。
(6)HttpServlet呼叫HttpRequest物件的有關方法,獲取Http請求資訊。
(7)HttpServlet呼叫HttpResponse物件的有關方法,生成響應資料。
8 servlet特性
單例多執行緒
9 servlet是單例項的嗎?
servlet是單例項的
10 servlet是執行緒安全的嗎?為什麼?
Servlet物件並不是一個執行緒安全的物件。
Servlet第一次被呼叫的時候,init()方法會被呼叫,然後呼叫service() 方法,從第二次被請求開始,就直接呼叫service()方法。
因為servlet是單例項的,所以後面再次請求同一個Servlet的時候都不會建立Servlet例項,
而且web容器會針對每個請求建立一個獨立的執行緒,這樣多個併發請求會導致多個執行緒同時呼叫 service() 方法,這樣就會存線上程不安全的問題。
11 如何解決Servlet執行緒不安全的問題?
(1)不要在servlet中使用成員變數。
(2)可以給servlet中的方法新增同步鎖,Synchronized,但是不提倡,資料併發訪問會造成阻塞等待。
(3)可以實現 SingleThreadModel 介面,如下。這樣可以避免使用成員變數的問題,但是也不提倡,原因同上。
Public class Servlet1 extends HttpServlet implements SingleThreadModel{
……..
}
12 談談過濾器的作用
過濾器,是在java web中,你傳入的request,response提前過濾掉一些資訊,或者提前設定一些引數,然後再傳入servlet或者struts的 action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果使用者沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設定字符集,或者去除掉一些非法字元
13 談談攔截器的作用
攔截器,是在面向切面程式設計的就是在你的service或者一個方法,前呼叫一個方法,或者在方法後呼叫一個方法比如動態代理就是攔截器的簡單實現,在你呼叫方法前打印出字串(或者做其它業務邏輯的操作),也可以在你呼叫方法後打印出字串,甚至在你丟擲異常的時候做業務邏輯的操作。
14 攔截器和過濾器有什麼區別
攔截器基於反射機制,而過濾器基於函式回撥攔截器基於Strust2或SpringMVC這樣的表述層框架,而過濾器基於Servlet容器攔截器只能在框架內部生效,而過濾器可以對所有請求生效攔截器可以訪問框架內的資源物件(例如Spring IOC容器中的物件),而過濾器不能直接訪問框架內的資源物件
15 攔截器和過濾器的執行順序
過濾前 – 攔截前 – Action處理 – 攔截後 – 過濾後。
過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登入使用者不能訪問內部頁面的處理);過濾通過後,攔截器將檢查使用者提交資料的驗證,做一些前期的資料處理,接著把處理後的資料發給對應的Action;Action處理完成返回後,攔截器還可以做其他過程(還沒想到要做啥),再向上返回到過濾器的後續操作。