天天看點

Servlet---過濾器簡介web.xml 配置過濾器多個過濾器過濾器類别

版權聲明:本文為部落客原創文章,轉載請注明出處。 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>