Servlet基礎梳理(五)----Filter

       和Servlet類似,Filter也是一個實現特殊接口的普通java類,只不過實現了Filter接口,需要實現該接口的一些過濾方法,實現了對一些請求信息的攔截。首先,我們確定一下它攔截的對象:在瀏覽器調用Servlet之前,在服務器返回非瀏覽器之前就行過濾它可以攔截jsp,Servlet,靜態圖片和靜態HTML文件。相當於服務器的門衛,對客戶端發來的請求和對客戶端做出的響應進行過濾。

    那麼對於這麼一個類,如何讓他工作?

    首先,這個類需要實現Filter接口,將該接口的方法實現,然後在web.xml中註冊和映射攔截的路徑就行了。這樣一說跟Servlet的工作方式基本上一致,只不過Servlet配置的是可以訪問的路徑,這裏是攔截的路徑。其實實現接口的方法都很類似,都是一個init方法,這個方法附帶一個配置參數,利用這個配置參數可以獲取配置的各種信息,甚至包括ServletContext的配置信息;還有一個destroy方法,不用管;還有就是一個主要的每次用到的方法,只不過名字一個是service方法一個是doFilter方法,反正都是每次都用它工作就對了。

   這裏我們說一下它的配置(當然在Servlet3.0規範中可以使用註解,不用配置,但是學習時還是自己動手配一下加深學習比較好)。

  <filter>
  <filter-name>filterTest1</filter-name>
  <filter-class>Filter.FilterTest1</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>filterTest1</filter-name>
  <url-pattern>/filter/test1.jsp</url-pattern>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>FORWARD</dispatcher>
  </filter-mapping>
可以看到這裏的配置方式跟Servlet基本一致,後面dispatcher是設置攔截方式,一般默認是REQUEST,表示對請求進行攔截,當然這個也是用的最多的,其次是Forward方式,表示對轉發進行攔截。

Filter是相互鏈式的工作的,就是說一個Filter放行後會自動轉給另一個Filter來處理的,這裏他們工作的順序是根據web.xml中<filter-mapping>的順序來決定的。

   對於Filter,其經典的應用是處理用戶登錄問題,很多頁面,用戶沒有登錄則不給於顯示。其原理就是在Filter中判斷用戶的session狀態,如果登陸了就放行。利用Filter還可以解決亂碼問題,設置頁面請求的編碼,設置頁面是否緩存等:這裏給兩個簡單的代碼:

                //使瀏覽器不緩存
	        response.setDateHeader("Expires",-1);
		response.setHeader("Cache-Control","no-cache");
		response.setHeader("Pragma","no-cache");
可以在web.xml中設置編碼方式,在Filter中進行設置:

  

                 //解決亂碼:
                HttpServletRequest req=(HttpServletRequest) request;
		HttpServletResponse res=(HttpServletResponse) response;
		String encoding= fConfig.getServletContext().getInitParameter("encoding");//通過配置參數獲取web.xml中設置的編碼方式
		req.setCharacterEncoding(encoding);//設置編碼方式
		chain.doFilter(request, response);

OK,Filter就複習這麼多吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章