攔截器和過濾器區別總結
因為過濾器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的區別
開發十年,就只剩下這套架構體系了! >>>