摘要:而攔截器代理模式的實(shí)現(xiàn)基于反射,代理又分靜態(tài)代理和動(dòng)態(tài)代理,動(dòng)態(tài)代理是攔截器的簡(jiǎn)單實(shí)現(xiàn)。如果是處理前后,既可以使用攔截器也可以使用過濾器,如果都使用了,注意前后順序。
前言
關(guān)于過濾器Filter和攔截器Interceptor,大家都不會(huì)陌生,從一開始的servelet,到springmvc,再到現(xiàn)在的springboot,都有接觸到,記得剛接觸的時(shí)候,會(huì)容易弄混淆,想寫這篇文章做個(gè)小的總結(jié)
攔截器和過濾器的異同
相同點(diǎn)
都是aop編程思想的體現(xiàn),可以在程序執(zhí)行前后做一些操作,如權(quán)限操作,日志記錄等
不同點(diǎn):
Filter是Servlet規(guī)范中定義的,攔截器是Spring框架中的
觸發(fā)時(shí)機(jī)不一樣,過濾器是在請(qǐng)求進(jìn)入容器后,但請(qǐng)求進(jìn)入servlet之前進(jìn)行預(yù)處理的
攔截器可以獲取IOC容器中的各個(gè)bean,而過濾器就不行,攔截器歸Spring管理
Springboot實(shí)現(xiàn)過濾器和攔截器第一步:定義Filter
@Slf4j public class TestFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { log.info("TestFilter filter。。。。。。。。"); filterChain.doFilter(servletRequest, servletResponse); } }
第二步:注入springboot容器當(dāng)中
@Configuration public class FilterConfig { @Bean Filter testFilter(){ return new TestFilter(); } @Bean public FilterRegistrationBeanfilterRegistrationBean1(){ FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean<>(); filterRegistrationBean.setFilter((TestFilter) testFilter()); filterRegistrationBean.addUrlPatterns("/*"); //filterRegistrationBean.setOrder();多個(gè)filter的時(shí)候order的數(shù)值越小 則優(yōu)先級(jí)越高 return filterRegistrationBean; } }
第三步:定義攔截器
@Slf4j @Service(value = "testInterceptor") public class TestInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info("TestInterceptor preHandle...."); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { log.info("TestInterceptor postHandle...."); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { log.info("TestInterceptor afterCompletion...."); } }
第四步:加入springboot容器
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Autowired TestInterceptor testInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(testInterceptor) .addPathPatterns("/api/**"); } }
注意:這邊用的springboot是2.0.x,采取的是直接實(shí)現(xiàn)WebMvcConfigurer,因?yàn)閃ebMvcConfigurerAdapter被標(biāo)識(shí)了@Deprecated,就沒有繼承WebMvcConfigurerAdapter了
/** @deprecated */ @Deprecated public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer { public WebMvcConfigurerAdapter() { } }
第五步:還是啟動(dòng)之前的controller
@RestController @RequestMapping("/api/test") @Slf4j public class TestController { @RequestMapping(value = "/hello") public String test() { log.info("test hello............."); return "SUCCESS"; }
看到打印結(jié)果如下
2019-04-27/12:01:04.603||||||||^_^|[http-nio-8088-exec-1] INFO com.stone.zplxjj.filter.TestFilter 22 - TestFilter filter。。。。。。。。 2019-04-27/12:01:04.612||||||||^_^|[http-nio-8088-exec-1] INFO com.stone.zplxjj.interceptor.TestInterceptor 26 - TestInterceptor preHandle.... 2019-04-27/12:01:04.634||||||||^_^|[http-nio-8088-exec-1] INFO com.stone.zplxjj.interceptor.TestInterceptor 32 - TestInterceptor postHandle.... 2019-04-27/12:01:04.634||||||||^_^|[http-nio-8088-exec-1] INFO com.stone.zplxjj.interceptor.TestInterceptor 37 - TestInterceptor afterCompletion....小結(jié)
過濾器的實(shí)現(xiàn)基于回調(diào)函數(shù)。而攔截器(代理模式)的實(shí)現(xiàn)基于反射,代理又分靜態(tài)代理和動(dòng)態(tài)代理,動(dòng)態(tài)代理是攔截器的簡(jiǎn)單實(shí)現(xiàn)。那何時(shí)使用攔截器?何時(shí)使用過濾器?
如果是非spring項(xiàng)目,那么攔截器不能用,只能使用過濾器,這里說的攔截器是基于spring的攔截器。
如果是處理controller前后,既可以使用攔截器也可以使用過濾器,如果都使用了,注意前后順序。
如果是處理dispaterServlet前后,只能使用過濾器。
更多文章可以關(guān)注公眾號(hào):stonezplxjj和個(gè)人博客:http://www.zplxjj.com
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74327.html
摘要:四過濾器攔截器切面起作用的順序先是過濾器起作用然后攔截器起作用然后切面起作用最后進(jìn)入方法中五當(dāng)控制層即層的方法拋異常時(shí),過濾器攔截器切面拋異常的順序先是切面如果使用自定義異常再進(jìn)入這個(gè)處理異常類然后攔截器然后過濾器如果都沒處理,最后到 ...
摘要:目錄一的攔截三種方式二切片的演示示例項(xiàng)目三切片特點(diǎn)四過濾器攔截器切面起作用的順序五當(dāng)控制層即層的方法拋異常時(shí),過濾器攔截器切面拋異常的順序一的攔截三種方式過濾器攔截器切片二切片的演示示例項(xiàng)目自定義一個(gè)名稱為的切片,代碼 ...
摘要:通知和切點(diǎn)共同定義了關(guān)于切面的全部?jī)?nèi)容,它是什么時(shí)候,在何時(shí)和何處完成功能引入允許我們向現(xiàn)有的類添加新的方法或者屬性組裝方面來創(chuàng)建一個(gè)被通知對(duì)象。這可以在編譯時(shí)完成例如使用編譯器,也可以在運(yùn)行時(shí)完成。和其他純框架一樣,在運(yùn)行時(shí)完成織入。 原文:190301-SpringBoot基礎(chǔ)篇AOP之基本使用姿勢(shì)小結(jié) 一般來講,談到Spring的特性,繞不過去的就是DI(依賴注入)和AOP(切...
摘要:攔截服務(wù)一使用第三方過濾器直接加入項(xiàng)目攔截服務(wù)二使用自定義攔截器攔截服務(wù)三使用切片完結(jié) Spring攔截服務(wù)【一】(SpringBoot使用第三方過濾器Filter直接加入項(xiàng)目) Spring攔截服務(wù)【二】(SpringBoot使用自定義攔截器Interceptor) Spring攔截服務(wù)【三】(SpringBoot使用切片Aspect)【完結(jié)】
摘要:基于,支持后面的版本二基本使用網(wǎng)頁生成訪問生成項(xiàng)目并下載。這里的配置項(xiàng)可以自動(dòng)提示。數(shù)據(jù)配置文件配置四整合映射跟之前一樣注冊(cè)注冊(cè)攔截器五整合基本整合使用映射文件映射文件和注解同時(shí)存在注解引入配置文件增加事務(wù)六自動(dòng)配置自動(dòng)原理配置項(xiàng) 一、SpringBoot簡(jiǎn)介 1. 使用SSM開發(fā)項(xiàng)目的時(shí)候有什么不足之處 創(chuàng)建ssm項(xiàng)目比較麻煩 配置比較麻煩 依賴的配置比較多比較麻煩 手動(dòng)集成第三方...
閱讀 2584·2021-11-24 09:38
閱讀 2615·2019-08-30 15:54
閱讀 930·2019-08-30 15:52
閱讀 1917·2019-08-30 15:44
閱讀 2725·2019-08-30 13:48
閱讀 778·2019-08-29 16:21
閱讀 1006·2019-08-29 14:03
閱讀 2223·2019-08-28 18:15