星期四, 3月 15, 2012

[Java] 實作Filter

Filter顧名思義就是過濾器,在JSP/Servlet中,Filter的功用就是在擔任Request與Response的過濾功能,當使用者的request發出至某資源時,您可以先對request作一些前置處理,例如進行身份驗證、過濾不安全的請求、監視統計請求的來源與出處等等,Filter的功能是雙向的,您也可以對JSP/Servlet的response進行過濾或進行某些處理,例如對輸出先進行壓縮、對XML的呈現進行轉換等等。

總而言之,Filter可以擔任瀏覽器與JSP/Servlet之間的一個中介處理者,一些request的前置處理動作又一些response的後置處理,都可以交由這個中介處理者來完成,當然Filter可以達到的功能,我們也可以直接撰寫在JSP/Servlet中,但如果有很多JSP/Servlet都需要相同的處理,例如某些網頁都需要統一的身份驗證方式時,與其在每一個網頁中都撰寫驗證的程式碼,我們不如直接撰寫Filter,讓它來統一進行處理。

最近在測試Web Cache的行為,發現寫在Filter裡面的header最後能在回應標頭看到你所設定的結果。 如果在一般JSP的頁面加上Meta的Tags或使用response.setHeader的方式,在回應標頭都無法看到你所設定的結果。 但二者的快取效果都是一樣的。

@Override
 public void doFilter(
   ServletRequest request, 
   ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  
  //HttpServletRequest hsresq = (HttpServletRequest) request;
  HttpServletResponse hsresp = (HttpServletResponse)response;
  
  //current request server url(Don't include host and sitename)
  //String currentURL = hsresq.getServletPath();
  hsresp.setHeader("Pragma","no-cache"); 
  hsresp.setHeader("Cache-Control","no-cache,no-store,must-revalidate"); 
  //prevents caching at the proxy server
  hsresp.setDateHeader("Expires", 0); 
  
  chain.doFilter(request, response);
 }

在web.xml設定只對jsp的頁面進行filter,
注意url-pattern設定成/*.jsp是錯誤的。

<filter>
  <filter-name>JSPNoCacheFilter</filter-name>
  <filter-class>filter.JSPNoCacheFilter</filter-class>
 </filter>
    <filter-mapping>
 <filter-name>JSPNoCacheFilter</filter-name>
     <url-pattern>*.jsp</url-pattern>
 </filter-mapping>
Reference:
JSP Servlet Filter-1

沒有留言:

張貼留言

留個話吧:)

其他你感興趣的文章

Related Posts with Thumbnails