攔截器的實現類
在編寫一個攔截器的類的時候需要實現HandlerInterceptor接口
HandlerInterceptor接口方法如下:
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;
void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
- preHandler:業務處理器處理請求之前被調用,對用戶的request進行處理,若返回值為true,則繼續調用后續的攔截器和目標方法;若返回值為false,則終止請求;這里可以加上登錄校驗,權限攔截等。
- postHandler:Controller執行后但未返回視圖前調用該方法,這里可以對返回用戶前的模型數據進行加工處理。
- afterCompletion:Controller執行后且返回視圖后調用,可以得到Controller時的異常信息,這里可以記錄操作日志,資源清理等。
實現注冊攔截
這里我是重寫的preHandler方法,用來登錄攔截的。具體代碼實現如下
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//獲取request作用域中的token
String token = request.getHeader("token");
if (token == null) {
token = request.getParameter("token");
}
if (token != null) {
//解密token
Claims claims = JwtUtils.checkJWT(token);
if (claims != null) {
//獲取解密后的信息
Integer userId = (Integer) claims.get("id");
String name = (String) claims.get("name");
request.setAttribute("user_id",userId);
request.setAttribute("name",name);
return true;
}
}
return false;
}
在這,返回的無非就是一個true或false,所以中間我寫的是我的業務邏輯代碼,也就是通過獲取token來判斷用戶是否登錄,若未登錄,則返回false,終止該請求。
將攔截器加入到MVC中
在SpringBoot 2.0以上, WebMvcConfigurerAdapter已過時,但是WebMvcConfigurerAdapter實際上是WebMvcConfigurer接口的空實現類。故有兩種方法可以實現:推薦使用:implements WebMvcConfigurer
方法有如下幾種:
1. @EnableWebMvc + implements WebMvcConfigurer
在擴展類中重寫父類的方法即可,這種方法會屏蔽springboot對SpringMVC的自動配置。
2. implements WebMvcConfigurer
在擴展類中重寫父類的方法即可,這種方法會使用springboot對SpringMVC的自動配置。
3. extends WebMvcConfigurationSupport
在擴展類中重寫父類的方法即可,這種方法會屏蔽springboot對SpringMVC的自動配置。
接下來就是需要將攔截器加入到MVC中,也就是配置剛剛創建的攔截器,我們創建一個類,加上@Configuration這個注解並且實現WebMvcConfigurer這個接口
然后重寫addInterceptors這個方法把我們剛剛創建的攔截器配置好路徑后添加到MVC中即可。
具體實現如下:
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注冊攔截器 並配置攔截路徑
registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/user/api/v1/*/**");
//添加攔截器
WebMvcConfigurer.super.addInterceptors(registry);
}
}
