版權聲明:本文為部落客原創文章,轉載請注明出處。 https://blog.csdn.net/twilight_karl/article/details/75804651
簡介
要實作過濾器,必須實作Filter接口,并再web.xml或者注解中定義過濾器。過濾器有三個主要方法:
- init(FilterConfig config) 獲得初始化參數,用法與servlet相同,需要配置初始化參數
- doFilter(ServltRequest request,ServletResponse response,FilterChain chain) 執行過濾流程
- destory()過濾器關閉時執行
web.xml 配置過濾器
與Servlet的配置基本類似,除了url-pattern外,還可以通過servlet指定
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>filter.FirstFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>tom</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
通過servlet-name指定servlet
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<servlet-name>dispatcher.Dispatch</servlet-name>
</filter-mapping>
web3.0中使用注解配置過濾器
@WebFilter(
filterName="WrapperFilter",
urlPatterns={"/*"},
servletNames={},
initParams={
@WebInitParam(name="name",value="tom"),
@WebInitParam(name="password",value="123")
}
)
當同時有urlPattern和servletNames,則先對比urlPattern 再對比servletNames
多個過濾器
一個servlet可以同時有多個過濾器,執行時,按照web.xml先後順序組裝成一條鍊,執行完畢後,限制性最後進來執行的過濾器,即後進先出,類似于棧。
同時具有兩個過濾器的情況:
// FirstFilter
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("start-doFilter---FirstFilter");
arg2.doFilter(arg0, arg1);
System.out.println("end-doFilter---FirstFilter");
}
// SecondFilter
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("start---doFilter---SecondFilter");
chain.doFilter(request, response);
System.out.println("end---doFilter---SecondFilter");
}
// 結果:
start-doFilter---FirstFilter
start---doFilter---SecondFilter
end---doFilter---SecondFilter
end-doFilter---FirstFilter
過濾器類别
- request 使用者直接通路頁面時,調用過濾器
- forward 通過RequestDispatcher的forward通路時調用過濾器
- include 通過RequestDispatcher的include通路時調用過濾器
- error 一場處理機制調用時,調用過濾器
- async 異步
當Test1被forward方式通路時,觸發FirstFilter過濾器
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/Test1</url-pattern>
<dispatcher>forward</dispatcher>
</filter-mapping>
觸發方式
// Servlet
RequestDispatcher dispatch = req.getRequestDispatcher("/Test1").forward(req, resp);
// JSP
<jsp:forward page="index.jsp"></js
error
error-page可以在發生特定的錯誤時,跳轉到指定的頁面
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
由error-page跳轉的頁面需要經過error類型的過濾器,配置dispatcher後,發生錯誤時,過濾器可以采取相應措施
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/error.jsp</url-pattern>
<dispatcher>error</dispatcher>
</filter-mapping>