欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法

 更新時間:2019年09月27日 09:33:07   作者:桌前明月  
這篇文章主要介紹了玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

概述

首先聲明一下,這里所說的攔截器是 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種:

  1. 繼承 WebMvcConfigurerAdapter (官方已經(jīng)不建議使用)
  2. 實現(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 標(biāo)記為@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, 代碼如下:

<h1>${msg}</h1>

由于我這里使用的是 Freemarker 當(dāng)頁面使用,所以需要引入 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....

小結(jié)

SpringBoot 2 整合攔截器和整合 Filter的操作很像,都是通過一個注冊類將其注入到Spring的上下文中,只不過Filter使用的是 FilterRegistrationBean 而 攔截器使用的是 InterceptorRegistry。

個人覺得比使用 xml 配置的方式更為簡單了,如果你還沒有在 SpringBoot 項目中使用過攔截器,趕快來操作一下吧!

代碼示例

具體代碼示例請在我的GitHub 倉庫 springbootexamples 中模塊名為 spring-boot-2.x-interceptor 項目中進行查看

GitHub:https://github.com/zhuoqianmingyue/springbootexamples

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring實現(xiàn)動態(tài)切換多數(shù)據(jù)源的解決方案

    Spring實現(xiàn)動態(tài)切換多數(shù)據(jù)源的解決方案

    這篇文章主要給大家介紹了Spring實現(xiàn)動態(tài)切換多數(shù)據(jù)源的解決方案,文中給出了詳細的介紹和示例代碼,相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-01-01
  • 在Java中Scanner的用法總結(jié)

    在Java中Scanner的用法總結(jié)

    這篇文章主要介紹了在Java中Scanner的用法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java分布式鎖的三種實現(xiàn)方案

    Java分布式鎖的三種實現(xiàn)方案

    本文主要介紹了Java分布式鎖的三種實現(xiàn)方案。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • Java關(guān)鍵字之instanceof詳解

    Java關(guān)鍵字之instanceof詳解

    instanceof是Java的一個二元操作符,和==,>,<是同一類東東。由于它是由字母組成的,所以也是Java的保留關(guān)鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,返回boolean類型的數(shù)據(jù)
    2021-11-11
  • SpringBoot定時任務(wù)調(diào)度與爬蟲的配置實現(xiàn)

    SpringBoot定時任務(wù)調(diào)度與爬蟲的配置實現(xiàn)

    這篇文章主要介紹了SpringBoot定時任務(wù)調(diào)度與爬蟲的實現(xiàn),使用webmagic開發(fā)爬蟲,繼承PageProcessor接口編寫自己的處理類,process是定制爬蟲邏輯的核心接口,在這里編寫抽取邏輯,具體實現(xiàn)配置過程跟隨小編一起看看吧
    2022-01-01
  • Spring源碼解析之Bean的生命周期

    Spring源碼解析之Bean的生命周期

    今天給大家?guī)淼氖顷P(guān)于Java源碼的相關(guān)知識,文章圍繞著Bean的生命周期展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 詳解Java編寫算法時如何加快讀寫數(shù)據(jù)速度

    詳解Java編寫算法時如何加快讀寫數(shù)據(jù)速度

    這篇文章主要為大家詳細介紹了Java在編寫算法時如何加快讀寫數(shù)據(jù)速度,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java Map如何根據(jù)key取value以及不指定key取出所有的value

    Java Map如何根據(jù)key取value以及不指定key取出所有的value

    這篇文章主要介紹了Java Map如何根據(jù)key取value以及不指定key取出所有的value,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理

    SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理

    在我們開發(fā)SpringBoot后端服務(wù)時,一般需要給前端統(tǒng)一響應(yīng)格式,本文主要介紹了SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理
    2023-05-05
  • JFinal 調(diào)用存儲過程的步驟

    JFinal 調(diào)用存儲過程的步驟

    這篇文章主要介紹了JFinal 調(diào)用存儲過程的步驟,幫助大家更好的理解和學(xué)習(xí)使用JFinal,感興趣的朋友可以了解下
    2021-03-03

最新評論