1. 程式人生 > >10-撩課-Java面試寶典-第十篇

10-撩課-Java面試寶典-第十篇

81.Servlet的會話機制?

HTTP 是一種無狀態協議,
這意味著每次客戶端檢索網頁時,
都要單獨開啟一個伺服器連線,
因此伺服器不會記錄下
先前客戶端請求的任何資訊。
它與FTP、Telnet等協議不同,
FTP等協議可以記住使用者的連線資訊。

會話(Session)是指一個終端使用者
與互動系統進行通訊的時間間隔,
通常指從登陸系統到登出系統之間
所經過的時間以及如果需要的話,
可能還有一定操作空間。
JSP有四種方式實現會話跟蹤功能。

Cookie
伺服器在響應請求時
可以將一些資料以"鍵-值"對的形式
通過響應資訊儲存在客戶端。
當瀏覽器再次訪問相同的應用時,
會將原先的存有session ID的Cookie
通過請求資訊帶到伺服器端,
網路伺服器通過識別唯一的session ID來
代表每個客戶端,
從而識別這個客戶端接下來的請求。

用於會話跟蹤的Cookie叫做會話Cookie。
Servlet規範中會話跟蹤的cookie名字
必須是JSESSIONID,
儲存在瀏覽器的記憶體中。

Cookie可以用於保持使用者的會話狀態,
但Cookie資訊儲存在客戶端,
存在較大的安全隱患,
且一般瀏覽器對Cookie的數目
及資料大小有嚴格的限制。
在Web應用中,
一般情況下通過HttpSession物件保持會話狀態

Session
Session技術則是
服務端的解決方案,
它是通過伺服器來保持狀態的。
在Java中是通過呼叫
HttpServletRequest的getSession方法
使用true作為引數建立的。
在建立了Session的同時,
伺服器會為該Session生成唯一的Session id,
而這個Session id在隨後的請求中
會被用來重新獲得已經建立的Session;
在Session被建立之後,
就可以呼叫Session相關的方法
往Session中增加內容了,
而這些內容只會儲存在伺服器中,
發到客戶端的只有Session id;
當客戶端再次傳送請求的時候,
會將這個Session id帶上,
伺服器接受到請求之後
就會依據Session id找到相應的Session,
從而再次使用之。
正式這樣一個過程,
使用者的狀態也就得以保持了。

隱藏表單域
隱藏表單域是將會話ID
新增到HTML的隱藏表單中
(型別為hidden的input)。
重定向和轉發

重寫URL
把會話ID編碼在URL中。 
counter.jsp;jsessionnid=be8d697876787876befdbde898789098980

對於URL複寫,
伺服器從請求的URI中提取出會話ID,
並把該請求與相應的會話關聯起來,
然後在訪問會話資料的時候,
JSP頁面所進行的處理方式
就和使用cookie跟蹤會話id時
所使用的方式完全相同。
所以sesssion的實現
要依靠cookie或URL複寫技術。

82.Filter是什麼?有什麼作用?

 過濾器是處於客戶端與伺服器
資原始檔之間的一道過濾網,
在訪問資原始檔之前,
通過一系列的過濾器對請求進行修改、判斷等,
把不符合規則的請求在中途攔截或修改。
也可以對響應進行過濾,
攔截或修改響應。

瀏覽器發出的請求先遞交給第一個filter進行過濾,
符合規則則放行,
遞交給filter鏈中的下一個過濾器進行過濾。
過濾器在鏈中的順序
與它在web.xml中配置的順序有關,
配置在前的則位於鏈的前端。
當請求通過了鏈中所有過濾器後
就可以訪問資原始檔了,
如果不能通過,
則可能在中間某個過濾器中被處理掉。

在doFilter()方法中,
chain.doFilter()前的一般是對request執行的過濾操作,
chain.doFilter後面的程式碼
一般是對response執行的操作。


過濾器一般用於登入許可權驗證、
資源訪問許可權控制、
敏感詞彙過濾、
字元編碼轉換等等操作,
便於程式碼重用,
不必每個servlet中還要進行相應的操作。

83.Listener是什麼?有什麼作用?

監聽器用於監聽web應用中某些物件、
資訊的建立、銷燬、增加,修改,刪除等
動作的發生,
然後作出相應的響應處理。
當範圍物件的狀態發生變化的時候,
伺服器自動呼叫監聽器物件中的方法。
常用於統計線上人數和線上使用者,
系統載入時進行資訊初始化,
統計網站的訪問量等等。

分類:
按監聽的物件劃分,可以分為
ServletContext物件監聽器
HttpSession物件監聽器
ServletRequest物件監聽器
 
按監聽的事件劃分
物件自身的建立和銷燬的監聽器
物件中屬性的建立和消除的監聽器
session中的某個物件的狀態變化的監聽器

84.你瞭解過Servlet3.0嗎?

Servlet3.0相對於Servlet2.0來說
最大的改變是引入了Annotation註解
來取代xml配置,
用於簡化web應用的開發和部署。
最主要幾項特性:

1. 新增的註解支援:
該版本新增了若干註解,
用於簡化 Servlet、
過濾器(Filter)
和監聽器(Listener)的宣告,
這使得 web.xml 部署描述檔案
從該版本開始不再是必選的了。

2. 非同步處理支援:
有了該特性,
Servlet 執行緒不再需要一直阻塞,
直到業務處理完畢才能再輸出響應,
最後才結束該 Servlet 執行緒。
在接收到請求之後,
Servlet 執行緒可以將耗時的操作
委派給另一個執行緒來完成,
自己在不生成響應的情況下返回至容器。
針對業務處理較耗時的情況,
這將大大減少伺服器資源的佔用,
並且提高 併發處理速度。

3. 可插性支援:
熟悉 Struts2 的開發者一定會
對其通過外掛的方式
與包括 Spring 在內的各種常用框架的整合
特性記憶猶新。
將相應的外掛封裝成 JAR 包並放在類路徑下,
Struts2 執行時便能自動載入這些外掛。
現在 Servlet 3.0 提供了類似的特性,
開發者可以通過外掛的方式很方便的
擴充已有 Web 應用的功能,
而不需要修改原有的應用。

85.JSP和Servlet有哪些相同點和不同點?

JSP是Servlet技術的擴充套件,
本質上是Servlet的簡易方式,
更強調應用的外表表達。
JSP編譯後是"類servlet"。

Servlet和JSP最主要的不同點在於,
Servlet的應用邏輯是在Java檔案中,
並且完全從表示層中的HTML裡分離開來。
而JSP的情況是
Java和HTML可以組合
成一個副檔名為.jsp的檔案。

在實際專案開發當中,
JSP側重於檢視,
Servlet主要用於控制邏輯。