SpringBoot中使用攔截器的配置詳解
1. 應(yīng)用場(chǎng)景
攔截器是 AOP 的一種實(shí)現(xiàn),專門攔截對(duì)動(dòng)態(tài)資源的后臺(tái)請(qǐng)求,即攔截對(duì)控制層的請(qǐng) 求。使用場(chǎng)景比較多的是判斷用戶是否有權(quán)限請(qǐng)求后臺(tái),更拔高一層的使用場(chǎng)景也有,比如攔截器可以 結(jié)合 websocket 一起使用,用來(lái)攔截 websocket 請(qǐng)求,然后做相應(yīng)的處理等等。攔截器不會(huì)攔截靜態(tài) 資源,Spring Boot 的默認(rèn)靜態(tài)目錄為 resources/static,該目錄下的靜態(tài)頁(yè)面、js、css、圖片等等, 不會(huì)被攔截.
2. 定義攔截器
定義攔截器,只需要實(shí)現(xiàn) HandlerInterceptor 接口, 該接口中有三個(gè)方法:
preHandle(……) 、 postHandle(……) 和 afterCompletion(……) 。
- preHandle(……) 方法:該方法的執(zhí)行時(shí)機(jī)是,當(dāng)某個(gè) url 已經(jīng)匹配到對(duì)應(yīng)的 Controller 中的某個(gè)方法,且在這個(gè)方法執(zhí)行之前。所以 preHandle(……) 方法可以決定是否將請(qǐng)求放行,這是通過(guò)返回值來(lái)決定的,返回 true 則放行,返回 false 則不會(huì)向后執(zhí)行。
- postHandle(……) 方法:該方法的執(zhí)行時(shí)機(jī)是,當(dāng)某個(gè) url 已經(jīng)匹配到對(duì)應(yīng)的 Controller 中的某個(gè)方法,且在執(zhí)行完了該方法,但是在 DispatcherServlet 視圖渲染之前。所以在這個(gè)方法中有個(gè)ModelAndView 參數(shù),可以在此做一些修改動(dòng)作。
- afterCompletion(……) 方法:顧名思義,該方法是在整個(gè)請(qǐng)求處理完成后(包括視圖渲染)執(zhí)行,這時(shí)做一些資源的清理工作,這個(gè)方法只有在 preHandle(……) 被成功執(zhí)行后并且返回 true才會(huì)被執(zhí)行。
2.1 自定義攔截類實(shí)現(xiàn)HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor { private Logger logger = LoggerFactory.getLogger(MyInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); String methodName = method.getName(); logger.info("方法{}被攔截", methodName); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("方法被執(zhí)行,但是視圖還未渲染"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("方法執(zhí)行完畢,進(jìn)行資源清理"); } }
2.2 實(shí)現(xiàn)WebMvcConfigurer接口進(jìn)行攔截配置
實(shí)現(xiàn)WebMvcConfigurer的這種配置會(huì)自動(dòng)過(guò)濾靜態(tài)資源;
@Configuration public class MyInterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); } }
省略controller類
測(cè)試結(jié)果
10:52:16.316 [http-nio-8080-exec-1] INFO c.e.h.interceptors.MyInterceptor - 方法test被攔截
10:52:16.344 [http-nio-8080-exec-1] INFO c.e.h.interceptors.MyInterceptor - 方法被執(zhí)行,但是視圖還未渲染
10:52:16.344 [http-nio-8080-exec-1] INFO c.e.h.interceptors.MyInterceptor - 方法執(zhí)行完畢,進(jìn)行資源清理
定義哪些不用攔截
取消攔截操作
如果我要攔截所有 /admin 開頭的 url 請(qǐng)求的話,需要在攔截器配置中添加這個(gè)前綴,但是 在實(shí)際項(xiàng)目中,可能會(huì)有這種場(chǎng)景出現(xiàn):某個(gè)請(qǐng)求也是 /admin 開頭的,但是不能攔截,比如 /admin/login 等等
解決方案:
1.使用excludePathPatterns("/adminUser/login")
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/adminUser/login"); }
2.可以定義一個(gè)注解
該注解專門用來(lái)取消攔截操作,如果某個(gè) Controller 中的方法我們 不需要攔截掉,即可在該方法上加上我們自定義的注解即可,下面先定義一個(gè)注解:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface UnInterception { }
測(cè)試
controller類
@RestController @RequestMapping("/intercept") public class IntercepController { @UnInterception @RequestMapping("/hello") public String test() { return "success"; }
interceptor攔截類
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); String methodName = method.getName(); if (method.getAnnotation(UnInterception.class)!=null) { logger.info("方法{}不被攔截", methodName); return true; } logger.info("方法{}被攔截", methodName); return false; }
訪問(wèn) localhost:8080/intercept/hello
結(jié)果
11:34:24.648 [http-nio-8080-exec-1] INFO c.e.h.interceptors.MyInterceptor - 方法test不被攔截
11:34:24.676 [http-nio-8080-exec-1] INFO c.e.h.interceptors.MyInterceptor - 方法被執(zhí)行,但是視圖還未渲染
11:34:24.679 [http-nio-8080-exec-1] INFO c.e.h.interceptors.MyInterceptor - 方法執(zhí)行完畢,進(jìn)行資源清理
到此這篇關(guān)于SpringBoot中使用攔截器的配置詳解的文章就介紹到這了,更多相關(guān)SpringBoot攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
eclipse如何搭建Springboot項(xiàng)目詳解
今天帶大家學(xué)習(xí)eclipse如何搭建Spring boot項(xiàng)目,文中有非常詳細(xì)的圖文解說(shuō),對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05Javaweb項(xiàng)目啟動(dòng)Tomcat常見的報(bào)錯(cuò)解決方案
Java Web項(xiàng)目啟動(dòng)Tomcat時(shí)可能會(huì)遇到各種錯(cuò)誤,本文就來(lái)介紹一下Javaweb項(xiàng)目啟動(dòng)Tomcat常見的報(bào)錯(cuò)解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02