spring boot的攔截器簡單使用示例代碼
1.spring boot攔截器默認有:
HandlerInterceptorAdapter
AbstractHandlerMapping
UserRoleAuthorizationInterceptor
LocaleChangeInterceptor
ThemeChangeInterceptor
其中 LocaleChangeInterceptor 和 ThemeChangeInterceptor 比較常用。
2.實現(xiàn)自定義攔截器只需要3步:
1)、創(chuàng)建我們自己的攔截器類并實現(xiàn) HandlerInterceptor 接口。
2)、創(chuàng)建一個Java類繼承WebMvcConfigurerAdapter,并重寫 addInterceptors 方法。
3)、實例化我們自定義的攔截器,然后將對像手動添加到攔截器鏈中(在addInterceptors方法中添加)。
3.代碼示例
IndexInterceptor.java類代碼:
package com.example.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class IndexInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println(">>>IndexInterceptor>>>>>>>在整個請求結(jié)束之后被調(diào)用,也就是在DispatcherServlet 渲染了對應(yīng)的視圖之后執(zhí)行(主要是用于進行資源清理工作)");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println(">>>IndexInterceptor>>>>>>>請求處理之后進行調(diào)用,但是在視圖被渲染之前(Controller方法調(diào)用之后)");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println(">>>IndexInterceptor>>>>>>>在請求處理之前進行調(diào)用(Controller方法調(diào)用之前)");
// 只有返回true才會繼續(xù)向下執(zhí)行,返回false取消當前請求
return true;
}
}
IndexInterceptor2.java類代碼:
package com.example.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class IndexInterceptor2 implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println(">>>IndexInterceptor2>>>>>>>在整個請求結(jié)束之后被調(diào)用,也就是在DispatcherServlet 渲染了對應(yīng)的視圖之后執(zhí)行(主要是用于進行資源清理工作)");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println(">>>IndexInterceptor2>>>>>>>請求處理之后進行調(diào)用,但是在視圖被渲染之前(Controller方法調(diào)用之后)");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println(">>>IndexInterceptor2>>>>>>>在請求處理之前進行調(diào)用(Controller方法調(diào)用之前)");
// 只有返回true才會繼續(xù)向下執(zhí)行,返回false取消當前請求
return false;
}
}
SimpleWebAppConfigurer.java類代碼:
package com.example.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.example.interceptor.IndexInterceptor;
import com.example.interceptor.IndexInterceptor2;
//只要能被springboot掃描到即可
@Configuration
public class SimpleWebAppConfigurer extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多個攔截器組成一個攔截器鏈
// addPathPatterns 用于添加攔截規(guī)則
// excludePathPatterns 用戶排除攔截
registry.addInterceptor(new IndexInterceptor()).addPathPatterns("/**");
registry.addInterceptor(new IndexInterceptor2()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
4.攔截器解析說明
preHandle**:預(yù)處理回調(diào)方法,實現(xiàn)處理器的預(yù)處理(如登錄檢查),第三個參數(shù)為響應(yīng)的處理器(如我們上一章的Controller實現(xiàn));
返回值:true表示繼續(xù)流程(如調(diào)用下一個攔截器或處理器);
false表示流程中斷(如登錄檢查失?。粫^續(xù)調(diào)用其他的攔截器或處理器,此時我們需要通過response來產(chǎn)生響應(yīng);
postHandle**:后處理回調(diào)方法,實現(xiàn)處理器的后處理(但在渲染視圖之前),此時我們可以通過modelAndView(模型和視圖對象)對模型數(shù)據(jù)進行處理或?qū)σ晥D進行處理,modelAndView也可能為null。
afterCompletion**:整個請求處理完畢回調(diào)方法,即在視圖渲染完畢時回調(diào),如性能監(jiān)控中我們可以在此記錄結(jié)束時間并輸出消耗時間,還可以進行一些資源清理,類似于try-catch-finally中的finally,但僅調(diào)用處理器執(zhí)行鏈中preHandle返回true的攔截器的afterCompletion**。
以上所述是小編給大家介紹的spring boot的攔截器簡單使用淺析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
關(guān)于springboot中對sqlSessionFactoryBean的自定義
這篇文章主要介紹了springboot中對sqlSessionFactoryBean的自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java如何使用httpclient檢測url狀態(tài)及鏈接是否能打開
這篇文章主要介紹了Java如何使用httpclient檢測url狀態(tài)及鏈接是否能打開,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
spring cloud gateway如何獲取請求的真實地址
這篇文章主要介紹了spring cloud gateway如何獲取請求的真實地址問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
詳解Java如何在CompletableFuture中實現(xiàn)日志記錄
這篇文章主要為大家詳細介紹了一種slf4j自帶的MDC類,來記錄完整的請求日志,和在CompletableFuture異步線程中如何保留鏈路id,需要的可以參考一下2023-04-04
Java實現(xiàn)的圖片高質(zhì)量縮放類定義與用法示例
這篇文章主要介紹了Java實現(xiàn)的圖片高質(zhì)量縮放類定義與用法,涉及java針對圖片的運算與轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11

