Fileter過濾器的使用及小案例

回顧:java

EL:表達式語言,替代<%= %>
${表達式}
表達式中的數據除了常量必須來自於域中
取得域中數據 : pageScope/requestScope/sessionScope/applicationScope
param/paramValues/header/headerVlaues/pageContext/cookie/initParam
empty:判空
數值:0
對象:null
字符串:" "
集合: 長度是否爲0
在EL表達式中不區分單引號和雙引號,只要有引號,就算字符串
JSTL:JSP標準標籤庫:開發的一些有java語言實現的標籤.主要是用一些自定的標籤來實現頁面中的程序的流程控制(分支.循環)

如何使用JSTL:
導包 : jstl.jar standard.jar
在頁面引入:<%@ taglib uri=" " prefix=" " %>
經常使用標籤
< c:if test="結果爲布爾值的表達式" >沒有ELSE.
<c:forEach>
var:遍歷的當前對象(保存在page域的)
items:被遍歷的集合(EL表達式)
------------------------------------------------
var:循環控制變量
begin:起始值
end:結束值(閉區間)
step:步長
--------------------------------------------------
varStatus:封裝了當前循環的狀態的對象
index:索引,從0開始
count:計數.從1開始
first:當前是不是第一次
last:當前是不是最後一次
在JSP開發中使用JSTL和EL來替代以前所學的全部JSP的腳本web


Filter : 過濾器 : 至關於門衛服務器

功能:決定請求是否經過過濾器到達本來要訪問的目標
權限控制
預處理和後處理
如何開發一個過濾器:(加強型的servlet)
建立一個類,實現javax.servlet.Filter
在web.xml中配置註冊

過濾器的生命週期:(單例)
建立:服務器啓動
銷燬:服務器關閉(正常關閉纔會調用destroy方法)cookie


3.案例一:自動登陸:
3.1.需求分析:在訪問網站的首頁時,能夠實現自動登陸(不用輸入用戶名和密碼,直接進入「已登陸」狀態)。在訪問一個網站時,右上角「登陸、註冊」超連接,若是點登陸,轉跳到登陸頁面。登陸成功後回到首頁,右上角顯示「用戶姓名」等信息,表明當前用戶是「已登陸」狀態。
3.2.技術分析:
3.2.1.如何區分當前的狀態是已登陸仍是未登陸?把用戶信息保存到Session域,域中有用戶信息說明已登陸,沒有則說明未登陸。
3.2.2.(在以前的某次登陸中勾選了「自動登陸」,以後再次訪問首頁時)在請求到達IndexServlet以前,就已經進入「已登陸」狀態,登陸的工做只能在請求到達Servlet以前進行,因此只能是過濾器的預處理。也就是說要在過濾器的預處理中進行調用業務邏輯登陸驗證的工做。也就是說,須要把用戶名和密碼在某個地方保存一段時間(一週),斷電不消失,因此只能使用Cookie。
3.2.3.
3.3.步驟分析:
3.3.1.正確的登陸過程
3.3.2.業務邏輯在進行登陸的驗證的時候,不能再返回布爾值。因此改成返回用戶對象(User),若是用戶名密碼正確,則說明登陸成功,則返回用戶對象(用於保存到Session的),若是登陸失敗,則返回null。
3.3.3.若是登陸成功,且勾選了自動登陸,則把用戶名和密碼保存到Cookie中。並設置有效期爲一週。
3.3.4.Servlet中若是登陸成功,則把用戶對象保存到Session中,名爲current_user。返回首頁
3.3.5.JSP的頁面中,右上角去Session中取得用戶對象,若是獲得說明當前是已登陸狀態,則顯示用戶的姓名。不然顯示「登陸、註冊」超連接
3.3.6.建立一個過濾器(專門進行自動登陸),從Cookie中取出用戶名和密碼,調用業務邏輯進行登陸驗證,若是登陸成功,則把用戶對象保存到Session,名爲current_user。而後放行。若是登陸失敗,直接放行。
3.4.注意:這種功能必須提示用戶,只能在我的電腦上進行。session


4.案例二:統一解決中文亂碼問題
4.1.需求分析:之前在寫代碼時,每一個Servlet都要處理中文問題(請求的、響應的),如今可使用過濾器,對全部Servlet都進行統一的預處理來解決中文亂碼問題。
4.2.技術分析:
4.2.1.用過濾器過濾全部請求,對請求和響應的字符集進行設置。
4.2.2.因此要解決GET方式的亂碼問題,只能想辦法加強request對象的getParameter方法,讓方法中對原值進行從新編碼
4.2.3.而後再把加強後的request對象放行過去。這樣,Servlet接收到的就是加強後的Request對象,這時在Servlet中
4.2.4.調用getParameter方法時,調用的就是加強後的方法,在方法內進行了從新編碼 ,就能獲得正確結果了。
4.2.5.如何加強一類的方法:
4.2.5.1.繼承:必須知道實現類才能繼承,只知道接口是沒法繼承的
4.2.5.2.裝飾者模式
4.2.5.2.1.實現和被加強類同樣的接口
4.2.5.2.2.持有被加強類的對象(爲了可以調用原始方法)
4.2.5.3.動態代理app


4.3.步驟分析:
4.3.1.建立一個過濾器,在過濾器放行前,設置請求和響應的字符集。網站

 

總結:
Filter : 過濾器
如何開發一個過濾器:
建立一個類實現javax.servlet.Filter接口
在web.xml中配置註冊Filter(方式和servlet相似,注意:url-pattern匹配上的全部請求都要通過此過濾器)

過濾器的生命週期:
建立:項目啓動
銷燬:項目關閉(只有正常關閉纔會調用destroy方法)
運行期間:Filter是單例的
運行順序:
按照web.xml配置文件的順序依次運行Filter的預處理
請求到達目標處理完成後,在逆序依次運行Filter的後處理.
功能:能夠對請求和響應進行預處理,後處理,放行操做(不放行).
做用:
權限控制
預處理(字符集,自動登陸)和後處理(頁面靜態化,響應內的壓縮).編碼

相關文章
相關標籤/搜索