1. 程式人生 > >JavaWeb---過濾器Filter---(一)

JavaWeb---過濾器Filter---(一)

過濾器Filter


過慮器簡介:

過慮器能對客戶的請求進行預先處理,然後再將請求轉發給其他web元件。
過慮器是在Servlet2.3規範中定義的,它可以對Web元件的,ServletRequest和ServletResponse進行檢查和修改。
過慮器本身並不生成ServletRequest物件和ServletResponse物件,它只對web元件提供以下過慮功能:
在web元件呼叫之前檢查request,並修改請求頭和請求正文。
過慮器能夠在web元件被呼叫之後檢查response對像,修改響應頭和響應正文。


過慮器的過慮過程:



建立自定義的過慮器:


自定義的過慮器必須實現:javax.servlet.Filter介面。此介面定義了以下三個方法:
Init(FilterConfig conf) – 過慮器的初始化方法。-初始化工作執行一次(啟動時)。
doFilter(ServletRequest,ServletResponse,FilterChain) – 此方法完成實際的過慮操作。只要是配置的url匹配此過慮器的配置,即執行此方法。
destroy()-Servlet視窗在銷燬過慮器時執行此方法。-銷燬工作也只執行一次。


QUICK-START:

用過慮器實現請求字符集的設定:
第一步:實現Filter類。
第二步:在doFilter方法中書寫程式碼。
第三步:在Web.xml中配置過慮器。


也可以在doFilter方法,設定response的響應頭資訊。設定好之後再其他的Servlet中就不用再設定響應頭了,如下:
response.setContentType(“text/html;charset=UTF-8”);


釋出過慮器:



將字符集配置到過慮器的初始化引數中:



Filter的一些小細節:

doFilter方法中的chain.doFilter(r,p);不能忘記寫,否則轉不到目錄頁面。此方法的功能是將請求轉到下一個過慮器鏈。
在doFilter方法中,接收是與HTTP協議無關的request和response,要想使用session,必須進行強制型別轉換,即 : (HttpServletRequest)servletRequest.
在web.xml中配置的url-pattern通常以/開頭,但也可以以*.do這樣的形式加以定義。


配置說明:

過慮器的配置:以下幾乎是所有單位的標準配置

<filter>
  <filter-name>autoLoginFilter</filter-name>
  <filter-class>cn.itcast.autologinfilter.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>autoLoginFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
filter-name是過慮器的名稱
filter-class是過慮器的類檔案
init-param是過慮器的初始化引數。
param-name – 是引數名。
param-value - 是引數值。
filter-mapping是過慮器的對映資訊。
url-pattern-是需要過慮的資源url.


Filter-mapping子的元素:
對於一個<filter/>元素,可以設定多個filter-mapping對應的元素。
<serlvet-name/>如果不配置<url-pattern/>元素,也可以通過配置<serlvet-name/>元素的形式設定需要攔截的Servlet。
<dispatcher/>元素:可以為FORWARD- INCLUDE- REQUEST(預設)- ERROR之一。指定需要攔截的Servlet的請求試。

<filter-mapping>
	<filter-name>jspcache</filter-name>
	<url-pattern>*.jsp</url-pattern>
	<url-pattern>*.html</url-pattern>
	<servlet-name>login</servlet-name>
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>ERROR</dispatcher><!– 必須要在web.xml中配置error-page資訊才可以攔截 -- >
	<dispatcher>INCLUDE</dispatcher>
	<dispatcher>FORWARD</dispatcher><!– 應該新增此配置 -- >
</filter-mapping>


過濾器技術要點:
            1)可以攔截(在前端頁面與servlet之間進行)
            2)可以攔截伺服器中的任意資源(jsp,html,jpg,servlet)
            3)該攔截不影響訪問速度,而且可以放置多個過濾器
            4)優先順序高於servlet,請求時先執行filter,響應時後執行filter
            5) 有關路徑的說明:
                /*   攔截專案下的所有資源
                *.jsp  攔截所有的jsp頁面
                /jsps/*  攔截jsps目錄下的所有資源
                /buy/*   攔截buy目錄(注意,不一定是真實資料夾,這裡指的是路徑中的一段)下的所有資源
                /LoginServlet 只攔截該servlet
                login    只攔截名為“login”的servlet
                
                /jsps/*.jsp  ----非法路徑,因為裡面要求類似“*.jsp”這樣的格式只能放在開頭,不能放在後面
            6)如果配置了多個過濾器,它們的先後位置(從前端到後臺方向的先後順序)是以“filter-mapping” 的書寫順序來定的 


Filter的應用:
設定所有jsp頁面不快取:
開發步驟:
1、書寫一個Filter,在其doFilter方法中新增以下程式碼:

HttpServletResponse resp = (HttpServletResponse)response;
resp.setHeader("expires","-1");
resp.setHeader("pragma", "no-cache");
resp.setHeader("cache-control","no-cache");<pre name="code" class="java">chain.doFilter(request, resp);//注意是已經強轉了的對像

 2、將Filter配置到web.xml中。配置如下: 
 

<filter>
<filter-name>jspcache</filter-name>
<filter-class>cn.itcast.filter.JspPageFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>jspcache</filter-name>
  <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
3、開啟ie,清空所有Cookie的臨時檔案。
4、訪問本專案的jsp頁面,看快取中是否有臨時檔案。
5、將Filter的配置刪除,然後再去看是否會出現臨時檔案。