在SpringBoot中我們可以使用HandlerInterceptorAdapter這個(gè)適配器來(lái)實(shí)現(xiàn)自己的攔截器。這樣就可以攔截所有的請(qǐng)求并做相應(yīng)的處理。
應(yīng)用場(chǎng)景
- 日志記錄,可以記錄請(qǐng)求信息的日志,以便進(jìn)行信息監(jiān)控、信息統(tǒng)計(jì)等。
- 權(quán)限檢查:如登陸檢測(cè),進(jìn)入處理器檢測(cè)是否登陸,如果沒(méi)有直接返回到登陸頁(yè)面。
- 性能監(jiān)控:典型的是慢日志。
在HandlerInterceptorAdapter中主要提供了以下的方法:
- preHandle:在方法被調(diào)用前執(zhí)行。在該方法中可以做類似校驗(yàn)的功能。如果返回true,則繼續(xù)調(diào)用下一個(gè)攔截器。如果返回false,則中斷執(zhí)行,也就是說(shuō)我們想調(diào)用的方法 不會(huì)被執(zhí)行,但是你可以修改response為你想要的響應(yīng)。
- postHandle:在方法執(zhí)行后調(diào)用。
- afterCompletion:在整個(gè)請(qǐng)求處理完畢后進(jìn)行回調(diào),也就是說(shuō)視圖渲染完畢或者調(diào)用方已經(jīng)拿到響應(yīng)。
HandlerInterceptor
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
AsyncHandlerInterceptor
public interface AsyncHandlerInterceptor extends HandlerInterceptor {
default void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
}
}
abstract class HandlerInterceptorAdapter
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
public HandlerInterceptorAdapter() {
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
}
}
看到這3個(gè)類和接口關(guān)系我們就明白了集成 HandlerInterceptorAdapter 只是為了能讓我們只重寫自己需要的方法即可,如果我們需要全部重寫,也可以直接實(shí)現(xiàn)接口
運(yùn)行流程總結(jié)如下:
- 攔截器執(zhí)行順序是按照Spring配置文件中定義的順序而定的。
- 會(huì)先按照順序執(zhí)行所有攔截器的preHandle方法,一直遇到return false為止,比如第二個(gè)preHandle方法是return false,則第三個(gè)以及以后所有攔截器都不會(huì)執(zhí)行。若都是return true,則按順序加載完preHandle方法。
- 然后執(zhí)行主方法(自己的controller接口),若中間拋出異常,則跟return false效果一致,不會(huì)繼續(xù)執(zhí)行postHandle,只會(huì)倒序執(zhí)行afterCompletion方法。
- 在主方法執(zhí)行完業(yè)務(wù)邏輯(頁(yè)面還未渲染數(shù)據(jù))時(shí),按倒序執(zhí)行postHandle方法。若第三個(gè)攔截器的preHandle方法return false,則會(huì)執(zhí)行第二個(gè)和第一個(gè)的postHandle方法和afterCompletion(postHandle都執(zhí)行完才會(huì)執(zhí)行這個(gè),也就是頁(yè)面渲染完數(shù)據(jù)后,執(zhí)行after進(jìn)行清理工作)方法。(postHandle和afterCompletion都是倒序執(zhí)行)
編寫攔截器
public class LoginInterceptor extends HandlerInterceptorAdapter {
Logger logger = LoggerFactory.getLogger(getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("==============LoginInterceptor========preHandle==========");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("==============LoginInterceptor======postHandle============");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("==============LoginInterceptor=======afterCompletion===========");
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("==============LoginInterceptor========afterConcurrentHandlingStarted==========");
}
}
public class LoginInterceptor2 extends HandlerInterceptorAdapter {
Logger logger = LoggerFactory.getLogger(getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("==============LoginInterceptor2========preHandle==========");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("==============LoginInterceptor2======postHandle============");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("==============LoginInterceptor2=======afterCompletion===========");
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("==============LoginInterceptor2========afterConcurrentHandlingStarted==========");
}
}
WebMvcConfigurerAdapter 抽象類是對(duì)WebMvcConfigurer接口的簡(jiǎn)單抽象(增加了一些默認(rèn)實(shí)現(xiàn)),但在在SpringBoot2.0及Spring5.0中WebMvcConfigurerAdapter已被廢棄 。官方推薦直接實(shí)現(xiàn)WebMvcConfigurer或者直接繼承WebMvcConfigurationSupport
實(shí)現(xiàn)WebMvcConfigurer配置攔截器
@Configuration
public class SpringMVCConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor());
registry.addInterceptor(new LoginInterceptor2());
}
}
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-690810.html
自行驗(yàn)證上面"運(yùn)行流程總結(jié)"吧 不過(guò)多的贅述了文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-690810.html
到了這里,關(guān)于springboot web開(kāi)發(fā)登錄攔截器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!