過濾器
過濾器實際上就是對web資源進行的攔截,filter是Servlet的規範它是處於客戶端與服務器資源文件之間的一道過濾網 。通俗的來講,就是你想要訪問我的服務器,就需要首先通過過濾器的層層檢查,然後你的請求才會被servlet處理。
過濾器是配置在web.xml文件中的
<!--在web.xml裏面設置攔截器-->
<filter>
<filter-name>XxxFilter</filter-name>
<filter-class>XxxFilter類的全限定名</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
</filter>
<filter>
<filter-name>XxxFilter1</filter-name>
<filter-class>XxxFilter1類的全限定名</filter-class>
</filter>
<filter-mapping>
<filter-name>XxxFilter</filter-name>
<!--表示:當前Filter只對哪些資源做過濾/攔截操作,只對hello.jsp做攔截 -->
<url-pattern>/hello.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>XxxFilter1</filter-name>
<!--表示:當前Filter只對哪些資源做過濾/攔截操作,只對hello1.jsp做攔截 -->
<url-pattern>/hello1.jsp</url-pattern>
</filter-mapping>
多個攔截器的執行順序與web.xml文件中的filter-mapping的順序有關。
詳解
Filter三個生命週期方法
@Override
// Filter的初始化方法,在Servlet啓動時調用
//FilterConfig爲Filter的配置和運行環境
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
// Filter進行攔截請求時,Servlet將調用doFilter方法
//request 和response 分別對應本次訪問請求的請求體和響應體,chain則表示Filter鏈的對象
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
// 在Servlet對象被銷燬時調用,只能執行一次,釋放資源
public void destroy() {
}
Filter鏈
在一個web應用中,可以定義很多歌Filter攔截器對象,這些Filter組成一個Filter鏈(過濾器鏈)。
多個Filter(過濾器)的攔截順序與他們在Web.xml中映射(filter-mapping)順序一致。一個Filter執行完之後,會調用FilterChain.doFilter激活下一個Filter的doFilter方法。最後一個Filter.foFilter方法調用之後將會激活目標Servlet的service方法
FilterConfig接口
Filterconfig裏面封裝了Filter的配置參數信息。
FilterConfig接口定義的各個方法:
public interface FilterConfig {
//返回<filter-name>元素設置的值
String getFilterName();
//返回FilterConfig對象中所包裝的ServletContext對象的引用
ServletContext getServletContext();
//返回在web.xml文件中Filter所設置的某個名稱的初始化的參數值
String getInitParameter(String var1);
//返回一個Enumeration集合對象
Enumeration<String> getInitParameterNames();
}