Java過濾器Filter講解(Java基礎)

你好我是辰兮,很高興你能來閱讀,本篇文章小結了Java過濾器的知識點,獻給初學者,分享獲取新知,希望我們一起進步。



一、什麼是過濾器

Filter也稱之爲過濾器,它是Servlet技術中最激動人心的技術,WEB開發人員通過Filter技術,對web服務器管理 的所有web資源:例如Jsp, Servlet, 靜態圖片文件或靜態html文件等進行攔截,從而實現一些特殊的功能。
在這裏插入圖片描述
例如實現 URL級別的權限訪問控制、過濾敏感詞彙、壓縮響應信息等一些高級功能。

Servlet API中提供了一個Filter接口,開發web應用時,如果編寫的Java類實現了這個接口,則把這個java類稱之爲過濾器Filter。

通過Filter技術,開發人員可以實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截。


二、如何編寫過濾器

1、編寫java類實現Filter接口
2、重寫doFilter方法
3、設置攔截的url

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/myservlet1")//過濾路徑
public class MyFilter1 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("過濾器初始化了........init... "+filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("過濾前........doFilter "); //放行
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("過濾後.......doFilter");
    }

    @Override
    public void destroy() {
        System.out.println("銷燬了.....destroy");
    }

}

  • doFilter(ServletRequest, ServletResponse, FilterChain):這是一個完成過濾行爲的方法。這同樣是上游過濾器調用的方法。引入的FilterChain對象提供了後續過濾器所要調用的信息。如果該過濾器是過濾器鏈中的最後一個過濾器,則將請求交給被請求資源。也可以直接給客戶端返回響應信息。
  • init(FilterConfig):由Web容器來調用完成過濾器的初始化工作。它保證了在第一次doFilter()調用前由容器調用。您能獲取在web.xml 文件中指定的初始化參數。
  • destroy():由Web容器來調用來釋放資源,doFilter()中的所有活動都被該實例終止後,調用該方法。
  • ps:這裏繼承Filter千萬不要導錯了包import javax.servlet.*;

在這裏插入圖片描述

  • 向我這裏的我一開始點快了,導包錯誤就重寫不同的方法,完全不是一個接口

在這裏插入圖片描述


三、 過濾器的配置

1.註解式配置

在自定義的Filter類上使用註解@WebFilter(“/*”)

2.xml配置

  • 在web.xml中進行過濾器的配置:
<!--過濾器的xml配置 -->
<filter> 
    <!--名稱-->
    <filter-name>fi</filter-name>
     <!--過濾器類全稱--> 
    <filter-class>com.it.web.filter.SecondFilter</filter-class> 
</filter> 
    <!--映射路徑配-->
<filter-mapping>
   <!--名稱--> 
   <filter-name>fi</filter-name> 
   <!--過濾的url匹配規則和Servlet的一模一樣--> 
   <url-pattern>/</url-pattern>
</filter-mapping>

<url-pattern>/*</url-pattern>

在配置中需要注意的有兩處:一是指明過濾器類所在的包路徑。二是處定義過濾器作用的對象。一般有以下規則:

1:作用與所有web資源:<url—pattern>/*</url-pattern>。則客戶端請求訪問任意資源文件時都要經過過濾器過濾,通過則訪問文件,否則攔截。

2:作用於某一文件夾下所有文件:<url—pattern>/dir/*</url-pattern>

3:作用於某一種類型的文件:<url—pattern>*.擴展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>過濾所有對jsp文件的訪問請求。

4:作用於某一文件夾下某一類型文件:<url—pattern>/dir/*.擴展名</url-pattern>

如果一個過濾器需要過濾多種文件,則可以配置多個<filter-mapping>,一個mapping定義一個url-pattern來定義過濾規則。

四、Filter的生命週期

1、Filter的創建

Filter的創建和銷燬由web服務器負責。 web應用程序啓動時,web服務器將創建Filter的實例對象,並調用其init方法,完成對象的初始化功能,從而爲後續的用戶請求作好攔截的準備工作,filter對象只會創建一次,init方法也只會執行一次。通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。

2、Filter的銷燬

 web容器調用destroy方法銷燬Filter。destroy方法在Filter的生命週期中僅執行一次。在destroy方法中,可以釋放過濾器使用的資源。

3、FilterConfig接口

用戶在配置filter時,可以使用爲filter配置一些初始化參數,當web容器實例化Filter對象,調用其init方法時,會把封裝了filter初始化參數的filterConfig對象傳遞進來。因此開發人員在編寫filter時,通過filterConfig對象的方法,就可獲得:

  String getFilterName():得到filter的名稱。
  String getInitParameter(String name): 返回在部署描述中指定名稱的初始化參數的值。如果不存在返回null.
  Enumeration getInitParameterNames():返回過濾器的所有初始化參數的名字的枚舉集合。
  public ServletContext getServletContext():返回Servlet上下文對象的引用。

在這裏插入圖片描述


五、多個Filter的執行順序

如果一定要確保執行順序,就要對配置進行修改了,執行順序如下:

  • 在web.xml中,filter執行順序跟的順序有關,先聲明的先執行。
  • 使用註解配置的話,filter的執行順序跟名稱的字母順序有關,例如AFilter會比BFilter先執行。
  • 如果既有在web.xml中聲明的Filter,也有通過註解配置的Filter,那麼會優先執行web.xml中配置的Filter。
先執行帶有url-pattern標籤的filter,再執行帶有servlet-name標籤的filter
如果同爲url-pattern或servlet-name,則會按照在web.xml中的聲明順序執行
// ATestFilter
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    System.out.println("in ATestFilter");
    chain.doFilter(request, response);
}
 
 
// TestFilter
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    System.out.println("in TestFilter");
    chain.doFilter(request, response);
}
 
// ServletFilter
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    System.out.println("in ServletFilter");
    chain.doFilter(request, response);
}

在這裏插入圖片描述

  • 如圖配置中先有兩個/*路徑,這兩個先執行
in TestFilter
in ATestFilter
in ServletFilter
  • ps:測試代碼取自網絡

The best investment is to invest in yourself

在這裏插入圖片描述

2020.06.06 記錄辰兮的第78篇博客

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