如何在SpringBoot2中整合攔截器?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
公司主營業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出鐵東免費做網(wǎng)站回饋大家。
首先聲明一下,這里所說的攔截器是 SpringMVC 的攔截器(HandlerInterceptor)。使用SpringMVC 攔截器需要做如下操作:
創(chuàng)建攔截器類需要實現(xiàn) HandlerInterceptor
在 xml 配置文件中配置該攔截器,具體配置代碼如下:
<mvc:interceptors> <mvc:interceptor> <!-- /test/** 這個是攔截路徑以/test開頭的所有的URL--> <mvc:mapping path="/**"/><!—這個是攔截所有的路徑--> <!-- 配置攔截器類路徑--> <bean class="cn.ljk.springmvc.controller.MyInterceptor"></bean> <!-- 配置不攔截器URL路徑--> <mvc:exclude-mapping path="/fore/**"/> </mvc:interceptor> </mvc:interceptors>
因為在SpringBoot 中沒有 xml 文件,所以SpringBoot 為我們提供 Java Config 的方式來配置攔截器。配置方式有2種:
繼承 WebMvcConfigurerAdapter (官方已經(jīng)不建議使用)
實現(xiàn) WebMvcConfigurer
接下來開始 SpringBoot 整合攔截器操作詳細介紹!
整合攔截器實戰(zhàn)操作
第一步:聲明攔截器類
通過實現(xiàn) HandlerInterceptor 來完成。具體代碼如下:
public class LoginInterceptor implements HandlerInterceptor{}第二步:實現(xiàn) HandlerInterceptor 3 個攔截方法
preHandle:Controller邏輯執(zhí)行之前進行攔截
postHandle:Controller邏輯執(zhí)行完畢但是視圖解析器還未進行解析之前進行攔截
afterCompletion:Controller邏輯和視圖解析器執(zhí)行完畢進行攔截
實際開發(fā)中 preHandle 使用頻率比較高,postHandle 和 afterCompletion操作相對比較少。在下面的代碼中 preHandle 方法中定義攔截所有訪問項目 url 并進行日志信息記錄。
postHandle 中在視圖解析前進行攔截,通過 Model 再次添加數(shù)據(jù)到 Request域中。
afterCompletion 暫時沒有想到使用場景,如果有使用過的場景可以在下面評論區(qū)中進行評論。
攔截器詳細代碼如下:
public class LoginInterceptor implements HandlerInterceptor{
private Logger log = LoggerFactory.getLogger(LoginInterceptor.class);
//ControllerController邏輯執(zhí)行之前
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("preHandle....");
String uri = request.getRequestURI();
log.info("uri:"+ uri);
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
log.info("攔截 Controller:"+ handlerMethod.getBean().getClass().getName());
log.info("攔截方法:"+handlerMethod.getMethod().getName());
}
return true;
}
//Controller邏輯執(zhí)行完畢但是視圖解析器還未進行解析之前
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
log.info("postHandle....");
Map<String,Object>map=modelAndView.getModel();
map.put("msg","postHandle add msg");
}
//Controller邏輯和視圖解析器執(zhí)行完畢
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
log.info("afterCompletion....");
}
}第三步:Java Config 的方式來配置攔截器
繼承 WebMvcConfigurerAdapter 方式
通過繼承 WebMvcConfigurerAdapter 并重寫 addInterceptors方法,通過其參數(shù) InterceptorRegistry 將攔截器注入到 Spring的上下文中。
另外攔截路徑和不攔截的路徑通過InterceptorRegistry 的 addPathPatterns 和 excludePathPatterns 方法進行設(shè)置。
繼承 WebMvcConfigurerAdapter 方式官方已經(jīng)不建議使用,因為官方已將 WebMvcConfigurerAdapter 標記為@Deprecated 了。
@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {繼承 WebMvcConfigurerAdapter 方式具體代碼如下:
@Configuration
public class InterceptorConfigByExtendsWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter{
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html");
}
}實現(xiàn) WebMvcConfigurer 方式
通過實現(xiàn) WebMvcConfigurer 接口 并實現(xiàn) addInterceptors方法,其他操作和繼承 WebMvcConfigurerAdapter 方式一樣。具體代碼如下:
@Configuration
public class InterceptorConfigByImplWebMvcConfigurer implements WebMvcConfigurer{
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html");
}
}測試
編寫普通Controller,具體代碼如下:
@Controller
public class IndexController {
@GetMapping("/index")
public String index(ModelAndView modelAndView){
return "index";
}
}在 src/main/resource 下的 templates 目錄下創(chuàng)建 IndexController 訪問頁面 index.ftl, 代碼如下:
<h2>${msg}</h2>由于我這里使用的是 Freemarker 當頁面使用,所以需要引入 freemarker starter依賴,具體點如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
通過游覽器訪問 localhost:8080/sbe/index,具體訪問效果如下:

如上圖所示在視圖解析前通過 Model 再次添加數(shù)據(jù)到 Request域中的msg 成功顯示出來了!
日志輸出信息如下:(攔截地址和攔截Controller 和具體方法進行日志輸出)
2019-09-24 15:53:04.144 INFO 7732 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/sbe] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-09-24 15:53:04.145 INFO 7732 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-09-24 15:53:04.153 INFO 7732 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : preHandle....
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : uri:/sbe/index
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : 攔截 Controller:cn.lijunkui.controller.IndexController
2019-09-24 15:53:04.155 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : 攔截方法:index
2019-09-24 15:53:04.156 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : postHandle....
2019-09-24 15:53:04.161 INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor : afterCompletion....
關(guān)于如何在SpringBoot2中整合攔截器問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
網(wǎng)站標題:如何在SpringBoot2中整合攔截器
URL標題:http://chinadenli.net/article24/jighje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站改版、軟件開發(fā)、外貿(mào)建站、搜索引擎優(yōu)化、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)