首頁>技術>

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處理完成返回後,攔截器還可以做其他過程(還沒想到要做啥),再向上返回到過濾器的後續操作。

17
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • web前端待遇怎樣呢,需要哪些技術