Servlet開發之過濾器

來源:互聯網
上載者:User

   過濾器可以在請求到達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>配置過濾器的路徑匹配模式.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.