1. 程式人生 > >攔截器和過濾器區別總結

攔截器和過濾器區別總結

因為過濾器Filter是servlet相關的由serviette容器tomcat管理,而攔截器Interceptor是spring管理,因為web程式執行過程就是先啟動tomcat容器,之後再在容器中呼叫spring那些東西,所以首先我猜測順序是先走Filter過濾器 後進Interceptor攔截器

我通過程式進行測試來看區別,不說了,先上程式碼:

攔截器程式碼:

/**
 * 攔截器校驗引數
 * Created by wanghongsen on 16-3-31.
 */
public class ControllerInterceptor implements HandlerInterceptor {

    private Logger logger = LoggerFactory.getLogger(ControllerInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        logger.info("###################### before interceptor  #######################");

        if (UntilService.checkParameter(httpServletRequest)) {
            logger.info("ControllerInterceptor-preHandle-parameter is regular");
            return true;
        } else {
            logger.info("ControllerInterceptor-preHandle-parameter is empty");
            httpServletResponse.sendRedirect("/flight.jsp");
            return false;
        }
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        logger.info("%%%%%%%%%%%%%%%%%%%%%%  after interceptor  %%%%%%%%%%%%%%%%%%%%%%%");

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        logger.info("%%%%%%%%%%%%%%%%%%%%%%  complete interceptor  %%%%%%%%%%%%%%%%%%%%%%%");

    }
}

過濾器程式碼:

/**
 * 過濾器
 * Created by wanghongsen on 16-3-31.
 */

public class TicketFilter implements Filter {
    private Logger logger = LoggerFactory.getLogger(TicketFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        logger.info("###################   before do filter    ######################");
        filterChain.doFilter(servletRequest, servletResponse);
        logger.info("%%%%%%%%%%%%%%%%%%%   after do filter    %%%%%%%%%%%%%%%%%%%%%");
    }

    @Override
    public void destroy() {

    }
}

執行完之檢視日誌輸出如下:
14:46:48.558 [http-bio-8080-exec-10] INFO  c.q.fresh.base.filter.TicketFilter - ###################   before do filter    ######################
14:46:48.558 [http-bio-8080-exec-10] DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'springMVCDispatcher' processing GET request for
[/ticket/save] 14:46:48.558 [http-bio-8080-exec-10] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /ticket/save 14:46:48.559 [http-bio-8080-exec-10] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Returning handler method [public java.lang.String com.qunar.fresh.ticket.controller.TicketController.save(javax.servlet.http.HttpServletRequest)] 14:46:48.559 [http-bio-8080-exec-10] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'ticketController' 14:46:48.559 [http-bio-8080-exec-10] DEBUG o.s.web.servlet.DispatcherServlet - Last-Modified value for [/ticket/save] is: -1 14:46:48.559 [http-bio-8080-exec-10] INFO c.q.f.b.i.ControllerInterceptor - ###################### before interceptor ####################### 14:46:48.559 [http-bio-8080-exec-10] INFO c.q.f.b.i.ControllerInterceptor - ControllerInterceptor-preHandle-parameter is regular 14:46:48.576 [http-bio-8080-exec-10] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 14:46:48.580 [http-bio-8080-exec-10] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [[email protected]] was not registered for synchronization because synchronization is not active 14:46:48.587 [http-bio-8080-exec-10] DEBUG o.s.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 14:46:48.594 [http-bio-8080-exec-10] DEBUG o.m.s.t.SpringManagedTransaction - JDBC Connection [[email protected]] will not be managed by Spring 14:46:48.595 [http-bio-8080-exec-10] DEBUG c.q.f.ticket.dao.TicketDao.insert - ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyIm[email protected]] 14:46:48.603 [http-bio-8080-exec-10] DEBUG c.q.f.ticket.dao.TicketDao.insert - ==> Preparing: INSERT INTO ticket_info( airline, flight_no, passenger_name, passenger_age, flight_date ) VALUES ( ?, ?, ?, ?, ? ) 14:46:48.703 [http-bio-8080-exec-10] DEBUG c.q.f.ticket.dao.TicketDao.insert - ==> Parameters: 海南航空(String), 42s(String), 王紅森(String), 333(Integer), 2016-03-01 19:48:19.0(Timestamp) 14:46:48.707 [http-bio-8080-exec-10] DEBUG c.q.f.ticket.dao.TicketDao.insert - <== Updates: 1 14:46:48.712 [http-bio-8080-exec-10] DEBUG c.a.druid.pool.PreparedStatementPool - {conn-10003, pstmt-20000} enter cache 14:46:48.713 [http-bio-8080-exec-10] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [[email protected]] 14:46:48.713 [http-bio-8080-exec-10] DEBUG o.s.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource 14:46:48.713 [http-bio-8080-exec-10] INFO c.q.f.t.controller.TicketController - TicketController-save-order success! 14:46:48.715 [http-bio-8080-exec-10] INFO c.q.f.b.i.ControllerInterceptor - %%%%%%%%%%%%%%%%%%%%%% after interceptor %%%%%%%%%%%%%%%%%%%%%%% 14:46:48.715 [http-bio-8080-exec-10] DEBUG o.s.w.s.view.BeanNameViewResolver - No matching bean found for view name 'ticket/success' 14:46:48.717 [http-bio-8080-exec-10] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name 'ticket/success' 14:46:48.717 [http-bio-8080-exec-10] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 14:46:48.717 [http-bio-8080-exec-10] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 14:46:48.718 [http-bio-8080-exec-10] DEBUG o.s.web.servlet.DispatcherServlet - Rendering view [org.springframework.web.servlet.view.InternalResourceView: name 'ticket/success'; URL [/WEB-INF/views/ticket/success.jsp]] in DispatcherServlet with name 'springMVCDispatcher' 14:46:48.719 [http-bio-8080-exec-10] DEBUG o.s.w.s.view.InternalResourceView - Forwarding to resource [/WEB-INF/views/ticket/success.jsp] in InternalResourceView 'ticket/success' 14:46:48.754 [http-bio-8080-exec-10] INFO c.q.f.b.i.ControllerInterceptor - %%%%%%%%%%%%%%%%%%%%%% complete interceptor %%%%%%%%%%%%%%%%%%%%%%% 14:46:48.754 [http-bio-8080-exec-10] DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request 14:46:48.754 [http-bio-8080-exec-10] INFO c.q.fresh.base.filter.TicketFilter - %%%%%%%%%%%%%%%%%%% after do filter %%%%%%%%%%%%%%%%%%%%%

經過對日誌分析,總結出攔截器和過濾器在執行結果上的先後順序是

Filterpre->service->dispatcher->preHandle->controller->postHandle->afterCompletion->FilterAfter

流程圖如下:

過濾器和攔截器的區別:

1 攔截器是基於java的反射機制的,而過濾器是基於函式回撥。
2 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4 攔截器可以訪問action上下文、值棧裡的物件,而過濾器不能訪問。
5 在action的生命週期中,攔截器可以多次被呼叫,而過濾器只能在容器初始化時被呼叫一次。

6 攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裡注入一個service,可以呼叫業務邏輯。


相關推薦

攔截過濾器區別總結

因為過濾器Filter是servlet相關的由serviette容器tomcat管理,而攔截器Interceptor是spring管理,因為web程式執行過程就是先啟動tomcat容器,之後再在容器中呼叫spring那些東西,所以首先我猜測順序是先走Filter過濾器 後進

攔截過濾器區別

his view uri servlet容器 des owa acc long nlog 比如動態代理就是攔截器的簡單實現, public Object invoke(Object proxy, Method method, Object[] args) throws Th

攔截過濾器區別,Struts2與SpringMVC的區別

攔截器和過濾器 1.攔截器是基於java反射機制的,而過濾器是基於函式回撥的; 2.攔截器不依賴於servlet容器,而過濾器依賴於servlet容器; 3.攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用; 4.攔截器可以訪問Action上下文、值棧裡的物件,而過

springMVC攔截過濾器總結

cal .org 文件 bat system als request ping blog 攔截器: 用來對訪問的url進行攔截處理 用處: 權限驗證,亂碼設置等 spring-mvc.xml文件中的配置: <beans xmlns="http://www.sprin

攔截過濾器區別

str span line 實現 沒有 內部 不依賴 resp left 攔截器和過濾器都可以用來實現橫切關註功能,其區別主要在於: 1、攔截器是基於java反射機制的,而過濾器是基於函數回調的。 2、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。 3

Struts2攔截過濾器區別

tex ext struts 依賴 上下 生命周期 action 上下文 區別 ①過濾器依賴於Servlet容器,而攔截器不依賴於Servlet容器。 ②Struts2 攔截器只能對Action請求起作用,而過濾器則可以對幾乎所 有請求起作用。 ③攔截器可以訪問 Actio

javaWeb開發之攔截過濾器區別

攔截器和過濾的關係圖   攔截器和過濾器簡要區別 1、攔截器是基於java的反射機制的,而過濾器是基於函式回撥。2、攔截器不依賴與servlet容器,過濾器依賴與servlet容器。3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。4、攔截器可以訪問action

struts2攔截的執行原理以及攔截過濾器區別

struts2攔截器的執行原理:     注意:struts2.1.3以後的版中下邊這張圖中的FilterDispatcher已經改為StrutsPrepareAndExecuteFilter     1.首先伺服器接受請求,首先載入web.xml,通過核心控制器Stru

struts 攔截過濾器區別原理

攔截器的工作原理:當接收到一個httprequest ,a) 當外部的httpservletrequest到來時 b) 初始到了servlet容器 傳遞給一個標準的過濾器鏈 c) FilterDisp

面試題:struts 攔截過濾器

編程 att url face 三種方式 來看 字符 struts 規範 攔截器和過濾器的區別 過濾器是servlet規範中的一部分,任何java web工程都可以使用。 攔截器是struts2框架自己的,只有使用了struts2框架的工程才能用。 過濾器在url-patt

SpringMVC_第五章(攔截過濾器

1:什麼是過濾器(Filter) 過濾器Filter:過濾器通過實現Filter介面,實現了過濾器的三個方法,分別是初始化方法,dofilter方法和銷燬方法,隨著容器的啟動和銷燬而初始化和銷燬,依賴於servlet容器,過濾器攔截的是位址列請求,過濾器實在進入容器後執行的servlet之前後執

攔截 過濾器

攔截器(Interceptor)和過濾器(Filter)的執行順序和區別 個人分類: code框架 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/zxd1435513775/article/details

spring 框架下,如何通過攔截過濾器讀取request裡的內容

當我們用spring 攔截器實現許可權校驗的時候,往往我們需要從request中獲取一些資料進行校驗,但是當我們在攔截器獲取到資料,getinputStream,那麼在後續的action即:controller中我們獲取不到request,這是為什麼呢?因為java.util

一步一步學springboot (六)整合攔截過濾器及監聽器

一、實現過濾器Filter 1.新建類(注意這個類上的註解@Component,這個註解不可以用,如果不用,就得在springboot的那個標有@SpringBootApplication的類上加上@ServletComponentScan,總之是讓spring掃描並管理這

jsp四大作用域以及攔截過濾器分析

jsp中四個作用域的區別   application 在所有應用程式中有效   session 在當前會話中有效   request 在當前請求中有效   page 在當前頁面有效 首先要宣告一點,所謂"作用域"就是"資訊共享的範圍",也就是說一個資訊能夠在多大的範圍內有效

springboot下使用攔截過濾器

1. 攔截器Interceptor Spring MVC的攔截器(Interceptor)和Filter不同,但是也可以實現對請求進行預處理,後處理。先介紹它的使用,只需要兩步: 1.1 實現攔截器 實現攔截器可以自定義實現HandlerInter

spring 攔截過濾器的訪問順序

具體訪問順序為 先過濾器 後攔截器 測試: 過濾器寫法package com.buaa.nstri.common.filter; import java.io.IOException; impor

struts2 攔截過濾器理解

      面向切面程式設計(AOP是Aspect Oriented Program的首字母縮寫),我們知道,面向物件的特點是繼承、多型和封裝。而封裝就要求將功能分散到不同的物件中去,這在軟體設計中往往稱為職責分配。實際上也就是說,讓不同的類設計不同的方法。這樣程式碼就分散到一個個的類中去了。這樣做的好處是降

Spring Boot2(七):攔截過濾器

一、前言 過濾器和攔截器兩者都具有AOP的切面思想,關於aop切面,可以看上一篇文章。過濾器filter和攔截器interceptor都屬於面向切面程式設計的具體實現。 二、過濾器 過濾器工作原理 從上圖可以看出,當瀏覽器傳送請求到伺服器時,先執行過濾器,然後才訪問Web資源。伺服器響應Response,

過濾器攔截aop的區別

開發十年,就只剩下這套架構體系了! >>>