Filter過濾器和SpringMVC攔截器

Filter使用方法

//定義一個自己的過濾器,實現Filter接口
public class MyFilter implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        //在請求之前進行過濾
        System.out.println("before");
        //返回過濾器鏈,繼續通過下一個過濾器
        //如果此處不想繼續執行,可以直接return,不用繼續doFilter
        chain.doFilter(req, res);
        //請求結束之後
        System.out.println("after");
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

<!-- web.xml配置文件,配置filter和filter-mapping,name要對應 -->
<!-- 可以配置多個filter-mapping,只需要name與filter對應即可 -->
<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

結果這裏寫圖片描述

SpringMvc攔截器使用方法

//實現HandlerInterceptor,需要實現三個方法
//也可以繼承HandlerInterceptorAdapter,preHandle默認返回true
//根據需要重寫自己的方法
public class MyInterceptor implements HandlerInterceptor{

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("視圖渲染後");
        // TODO Auto-generated method stub

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("請求處理後,視圖渲染前");
        // TODO Auto-generated method stub

    }

    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object arg2) throws Exception {
        System.out.println("請求處理前");
        return true;
        }
    }

配置文件的配置
<mvc:interceptors>
        <mvc:interceptor>
            <!-- 攔截路徑,這裏表示攔截所有 -->
            <mvc:mapping path="/**" />
            <bean class="cn.edu.hbue.soft.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

結果這裏寫圖片描述

以下引用https://www.cnblogs.com/panxuejun/p/7715917.html

這裏寫圖片描述
這裏寫圖片描述

Filter可以攔截所有請求,在請求前後進行處理
Interceptor只能攔截經過前端控制器的請求,在具體的controller前後進行處理,只要一個pre返回true了,直接到after

Filter基於回調,Interceptor基於反射

這裏寫圖片描述
這就是基於回調,這裏的Code1和Code2實際上就是自己寫的攔截器的doFilter
Chain.doFilter調用MyFitler.doFilter,然後MyFilter.doFilter反過來又調用Chain.doFilter
在這個過程中執行了service方法

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