詳解SpringMVC中攔截器的概念及入門(mén)案例
一、攔截器概念
攔截器(Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,在SpringMVC中動(dòng)態(tài)攔截控制器方法的執(zhí)行
作用:
在指定的方法調(diào)用前后執(zhí)行預(yù)先設(shè)定的代碼
阻止原始方法的執(zhí)行

攔截器與過(guò)濾器區(qū)別
歸屬不同:Filter屬于Servlet技術(shù),Interceptor屬于SpringMVC技術(shù)
攔截內(nèi)容不同:Filter對(duì)所有的訪(fǎng)問(wèn)進(jìn)行增強(qiáng),Interceptor僅針對(duì)SpringMVC的訪(fǎng)問(wèn)進(jìn)行增強(qiáng)
二、攔截器入門(mén)案例
1、聲明攔截器的bean,并實(shí)現(xiàn)HandlerInterceptor接口(注意:掃描加載bean)
@Component
//定義攔截器類(lèi),實(shí)現(xiàn)HandlerInterceptor接口
//注意當(dāng)前類(lèi)必須受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {
@Override
//原始方法調(diào)用前執(zhí)行的內(nèi)容
//返回值類(lèi)型可以攔截控制的執(zhí)行,true放行,false終止
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
return true;
}
@Override
//原始方法調(diào)用后執(zhí)行的內(nèi)容
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
}
@Override
//原始方法調(diào)用完成后執(zhí)行的內(nèi)容
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion...");
}
}2、定義配置類(lèi),繼承WebMvcConfigurationSupport,實(shí)現(xiàn)addInterceptor(注意掃描加載配置)
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
。。。
}
}
3、添加攔截器并設(shè)定攔截的訪(fǎng)問(wèn)路徑,路徑可以通過(guò)可變參數(shù)設(shè)置多個(gè)
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
//配置攔截器
registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
}
}
4、使用標(biāo)準(zhǔn)接口WebMvcConfigurer簡(jiǎn)化開(kāi)發(fā)(注意:侵入式較強(qiáng))
@Configuration
@ComponentScan({"com.itheima.controller"})
@EnableWebMvc
//實(shí)現(xiàn)WebMvcConfigurer接口可以簡(jiǎn)化開(kāi)發(fā),但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//配置攔截器
registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
}
}
攔截器執(zhí)行流程


preHandle() :該方法在控制器方法之前執(zhí)行,如果返回false,說(shuō)明攔截器不放行該請(qǐng)求,自己處理或者結(jié)束該請(qǐng)求。如果返回true,說(shuō)明攔截器放行該請(qǐng)求,由其它匹配的攔截器或者控制器繼續(xù)處理。
postHandle():該方法在控制器方法調(diào)用之后,且解析視圖之前執(zhí)行,可以通過(guò)此方法對(duì)請(qǐng)求域中的模型和視圖做出進(jìn)一步的修改。
afterCompletion():該方法會(huì)在整個(gè)請(qǐng)求完成,即視圖渲染結(jié)束之后執(zhí)行。
到此這篇關(guān)于詳解SpringMVC中攔截器的概念及入門(mén)案例的文章就介紹到這了,更多相關(guān)SpringMVC攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決mybatis where-if中if不能識(shí)別大寫(xiě)AND,OR的問(wèn)題
這篇文章主要介紹了解決mybatis where-if中if不能識(shí)別大寫(xiě)AND,OR的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Springboot使用redisson實(shí)現(xiàn)分布式鎖的代碼示例
在實(shí)際項(xiàng)目中,某些場(chǎng)景下可能需要使用到分布式鎖功能,那么實(shí)現(xiàn)分布式鎖有多種方式,常見(jiàn)的如mysql分布式鎖、zookeeper分布式鎖、redis分布式鎖,本文介紹springboot如何使用redisson實(shí)現(xiàn)分布式鎖,需要的朋友可以參考下2023-06-06
Java基于棧方式解決漢諾塔問(wèn)題實(shí)例【遞歸與非遞歸算法】
這篇文章主要介紹了Java基于棧方式解決漢諾塔問(wèn)題的方法,結(jié)合實(shí)例形式分析了java棧方式采用遞歸與非遞歸算法解決漢諾塔問(wèn)題的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Spring Web零xml配置原理以及父子容器關(guān)系詳解
這篇文章主要介紹了Spring Web零xml配置原理以及父子容器關(guān)系詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
使用Java實(shí)現(xiàn)RabbitMQ延時(shí)隊(duì)列
RabbitMQ?延時(shí)隊(duì)列是指消息在發(fā)送到隊(duì)列后,并不立即被消費(fèi)者消費(fèi),而是等待一段時(shí)間后再被消費(fèi)者消費(fèi),本文為大家介紹了實(shí)現(xiàn)RabbitMQ延時(shí)隊(duì)列的Java代碼,希望對(duì)大家有所幫助2023-06-06
Java設(shè)計(jì)模式UML之類(lèi)圖精解
在UML類(lèi)圖中,類(lèi)使用包含類(lèi)名、屬性(field) 和方法(method) 且?guī)в蟹指罹€(xiàn)的矩形來(lái)表示,比如下圖表示一個(gè)Employee類(lèi),它包含name,age和email這3個(gè)屬性,以及modifyInfo()方法2022-02-02

