SpringBoot開發(fā)之?dāng)r截器實例
1 攔截器
列如常見的登錄攔截校驗:
1 HandlerInterceptor 接口
/**
* 登錄檢查
* 1、配置好攔截器要攔截哪些請求
* 2、把這些配置放在容器中
*/
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目標(biāo)方法執(zhí)行之前
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
log.info("preHandle攔截的請求路徑是{}",requestURI);
// 登錄檢查邏輯
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser != null){
// 放行
return true;
}
// 攔截住。未登錄。跳轉(zhuǎn)到登錄頁
request.setAttribute("msg","請先登錄");
// re.sendRedirect("/");
request.getRequestDispatcher("/").forward(request,response);
return false;
}
/**
* 目標(biāo)方法執(zhí)行完成以后
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle執(zhí)行{}",modelAndView);
}
/**
* 頁面渲染以后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion執(zhí)行異常{}",ex);
}
}2 配置攔截器
/**
* 1、編寫一個攔截器實現(xiàn)HandlerInterceptor接口
* 2、攔截器注冊到容器中(實現(xiàn)WebMvcConfigurer的addInterceptors)
* 3、指定攔截規(guī)則【如果是攔截所有,靜態(tài)資源也會被攔截】
*/
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") // 所有請求都被攔截包括靜態(tài)資源
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**"); // 放行的請求
}
}2 攔截器原理
1 根據(jù)當(dāng)前請求,找到**HandlerExecutionChain【**可以處理請求的handler以及handler的所有 攔截器】
2 先來順序執(zhí)行 所有攔截器的 preHandle方法
- 如果當(dāng)前攔截器prehandler返回為true。則執(zhí)行下一個攔截器的preHandle
- 如果當(dāng)前攔截器返回為false。直接倒序執(zhí)行所有已經(jīng)執(zhí)行了的攔截器的 afterCompletion;
3 如果任何一個攔截器返回false。直接跳出不執(zhí)行目標(biāo)方法
4 所有攔截器都返回True。執(zhí)行目標(biāo)方法
5 倒序執(zhí)行所有攔截器的postHandle方法
6 前面的步驟有任何異常都會直接倒序觸發(fā) afterCompletion
7 頁面成功渲染完成以后,也會倒序觸發(fā) afterCompletion
到此這篇關(guān)于SpringBoot開發(fā)之?dāng)r截器詳解的文章就介紹到這了,更多相關(guān)SpringBoot攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java的Struts框架中登陸功能的實現(xiàn)和表單處理器的使用
這篇文章主要介紹了Java的Struts框架中登陸功能的實現(xiàn)和表單處理器的使用,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息
在一次項目開發(fā)中,使用到了Netty網(wǎng)絡(luò)應(yīng)用框架,以及MQTT進(jìn)行消息數(shù)據(jù)的收發(fā),這其中需要后臺來將獲取到的消息主動推送給前端,所以本文記錄了SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息的操作,需要的朋友可以參考下2024-02-02
詳解MyBatis直接執(zhí)行SQL查詢及數(shù)據(jù)批量插入
這篇文章主要介紹了MyBatis直接執(zhí)行SQL查詢及數(shù)據(jù)批量插入的相關(guān)知識,需要的朋友一起學(xué)習(xí)吧2016-01-01

