過濾器可以在請求到達JSP或Servlet之前或響應返回用戶端之前添加一些額外的操作.如果有多個JSP頁面和Servlet都需要進行一個相同或相似的操作,我們可以把這個操作抽取到一個Servlet過濾器中,並通過匹配路徑截獲感興趣JSP或Servlet.
我們舉幾個典型的過濾器應用的例子,讀者可以推而廣之:
·編碼轉換
亂碼問題困擾了不少的Web應用程式開發人員,這是因為基於Java的Web應用程式可能運行於不同的Web應用程式器、作業系統平台或硬體伺服器上,不同的環境有自己預設的編碼類別型,在資料的轉換過程中不同的預設編碼是亂碼問題的始作俑者,所以在開發JSP時常常需要將資料進行編碼轉換.我們可以建立一個Servlet過濾器在請求進入服務程式前都進行編碼轉換.
·添加統一的標題或腳註
有些網頁需要添加統一的標題頭或腳註,可以通過Servlet過濾器在響應返回到用戶端前給網頁添加上統一的標題和腳註.
·進行安全的控制
登入系統後,一般都會將使用者資訊對象放入到session中,可以通過Servlet過濾器在請求進入JSP或Servlet前判斷session中是否有使用者資訊對象,如果有,則說明使用者已經登入,如果沒有,則說明使用者還沒有登入,將請求重新導向到登入頁面.
LoginCheckFilter.java代碼
package bookstore.servlet;
public class LoginCheckFilter
extends HttpServlet implements Filter
...{
public void doFilter(ServletRequest request, ServletResponse response
, FilterChain filterChain)
...{
try
...{
//進行請求和響應的類型轉換
HttpServletRequest httpRequest =
(HttpServletRequest) request;
HttpServletResponse httpResponse =
(HttpServletResponse) response;
boolean isValid = true
;
String uriStr =
httpRequest.getRequestURI().toUpperCase();
if (uriStr.indexOf("LOGIN.JSP") == -1 &&
uriStr.indexOf(
"SWITCH.JSP") == -1 &&
httpRequest.getSession().getAttribute(
"ses_userBean") == null
)
...
{
isValid = false
;
}
if
(isValid)
...
{
filterChain.doFilter(request, response);
} else
...
{
httpResponse.sendRedirect("/webModule/login.jsp"
);
}
} catch (ServletException sx)
...{
filterConfig.getServletContext().log(sx.getMessage());
} catch (IOException iox)
...{
filterConfig.getServletContext().log(iox.getMessage());
}
}
}
由於login.jsp是使用者登入頁面,而switch.jsp是使用者登入處理頁面,在訪問這兩個頁面時使用者資訊對象都還沒有產生,所以應該將這兩個頁面排除在過濾器檢驗規則這外.我們通過判斷請求路徑獲知是否是login.jsp和switch.jsp,如第18~19行所示.
如果不是這兩個頁面,則都必須進行檢驗,判斷頁面的session對象中是否包含以ses_userBean命名的對象(第20行).如果沒有包含以ses_userBean命名的對象,重新導向到登入頁面(第29行),否則將請求傳給請求的目標程式(第26行).
開啟web.xml,你將看到有關LoginCheckFilter過濾器的部署描述配置資訊,如下粗體所示:
過濾器的部署描述配置資訊
<web-app>
<display-name>webModule</display-name>
<filter>
<filter-name>logincheckfilter</filter-name>
<filter-class>bookstore.servlet.LoginCheckFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>logincheckfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<filter-name>配置過濾器的名字和實作類別,而<filter-mapping>配置過濾器的路徑匹配模式.