最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

概述

首先聲明一下,這里所說(shuō)的攔截器是 SpringMVC 的攔截器(HandlerInterceptor)。使用SpringMVC 攔截器需要做如下操作:

創(chuàng)建攔截器類需要實(shí)現(xiàn) HandlerInterceptor

在 xml 配置文件中配置該攔截器,具體配置代碼如下:

<mvc:interceptors>
 <mvc:interceptor>
 <!-- /test/** 這個(gè)是攔截路徑以/test開(kāi)頭的所有的URL-->
 <mvc:mapping path="/**"/><!—這個(gè)是攔截所有的路徑-->
 <!-- 配置攔截器類路徑-->
 <bean class="cn.ljk.springmvc.controller.MyInterceptor"></bean>
 <!-- 配置不攔截器URL路徑-->
 <mvc:exclude-mapping path="/fore/**"/>
 </mvc:interceptor>
</mvc:interceptors>

因?yàn)樵赟pringBoot 中沒(méi)有 xml 文件,所以SpringBoot 為我們提供 Java Config 的方式來(lái)配置攔截器。配置方式有2種:

  1. 繼承 WebMvcConfigurerAdapter (官方已經(jīng)不建議使用)
  2. 實(shí)現(xiàn) WebMvcConfigurer

接下來(lái)開(kāi)始 SpringBoot 整合攔截器操作詳細(xì)介紹!

整合攔截器實(shí)戰(zhàn)操作

第一步:聲明攔截器類

通過(guò)實(shí)現(xiàn) HandlerInterceptor 來(lái)完成。具體代碼如下:

public class LoginInterceptor implements HandlerInterceptor{}

第二步:實(shí)現(xiàn) HandlerInterceptor 3 個(gè)攔截方法

  • preHandle:Controller邏輯執(zhí)行之前進(jìn)行攔截
  • postHandle:Controller邏輯執(zhí)行完畢但是視圖解析器還未進(jìn)行解析之前進(jìn)行攔截
  • afterCompletion:Controller邏輯和視圖解析器執(zhí)行完畢進(jìn)行攔截

實(shí)際開(kāi)發(fā)中 preHandle 使用頻率比較高,postHandle 和 afterCompletion操作相對(duì)比較少。在下面的代碼中 preHandle 方法中定義攔截所有訪問(wèn)項(xiàng)目 url 并進(jìn)行日志信息記錄。

postHandle 中在視圖解析前進(jìn)行攔截,通過(guò) Model 再次添加數(shù)據(jù)到 Request域中。

afterCompletion 暫時(shí)沒(méi)有想到使用場(chǎng)景,如果有使用過(guò)的場(chǎng)景可以在下面評(píng)論區(qū)中進(jìn)行評(píng)論。

攔截器詳細(xì)代碼如下:

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í)行完畢但是視圖解析器還未進(jìn)行解析之前
  @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 的方式來(lái)配置攔截器

繼承 WebMvcConfigurerAdapter 方式

通過(guò)繼承 WebMvcConfigurerAdapter 并重寫(xiě) addInterceptors方法,通過(guò)其參數(shù) InterceptorRegistry 將攔截器注入到 Spring的上下文中。

另外攔截路徑和不攔截的路徑通過(guò)InterceptorRegistry 的 addPathPatterns 和 excludePathPatterns 方法進(jìn)行設(shè)置。

繼承 WebMvcConfigurerAdapter 方式官方已經(jīng)不建議使用,因?yàn)楣俜揭褜?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");
  }
}

實(shí)現(xiàn) WebMvcConfigurer 方式

通過(guò)實(shí)現(xiàn) WebMvcConfigurer 接口 并實(shí)現(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");
  }
}

測(cè)試

編寫(xiě)普通Controller,具體代碼如下:

@Controller
public class IndexController {
 
 @GetMapping("/index")
 public String index(ModelAndView modelAndView){
 
 return "index";
 }
}

在 src/main/resource 下的 templates 目錄下創(chuàng)建 IndexController 訪問(wèn)頁(yè)面 index.ftl, 代碼如下:

<h1>${msg}</h1>

由于我這里使用的是 Freemarker 當(dāng)頁(yè)面使用,所以需要引入 freemarker starter依賴,具體點(diǎn)如下:

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-freemarker</artifactId>
 </dependency>

通過(guò)游覽器訪問(wèn) localhost:8080/sbe/index,具體訪問(wèn)效果如下:

如上圖所示在視圖解析前通過(guò) Model 再次添加數(shù)據(jù)到 Request域中的msg 成功顯示出來(lái)了!

日志輸出信息如下:(攔截地址和攔截Controller 和具體方法進(jìn)行日志輸出)

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的操作很像,都是通過(guò)一個(gè)注冊(cè)類將其注入到Spring的上下文中,只不過(guò)Filter使用的是 FilterRegistrationBean 而 攔截器使用的是 InterceptorRegistry。

個(gè)人覺(jué)得比使用 xml 配置的方式更為簡(jiǎn)單了,如果你還沒(méi)有在 SpringBoot 項(xiàng)目中使用過(guò)攔截器,趕快來(lái)操作一下吧!

代碼示例

具體代碼示例請(qǐng)?jiān)谖业腉itHub 倉(cāng)庫(kù) springbootexamples 中模塊名為 spring-boot-2.x-interceptor 項(xiàng)目中進(jìn)行查看

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

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

相關(guān)文章

  • SpringBoot2.6.3集成quartz的方式

    SpringBoot2.6.3集成quartz的方式

    quartz是java里頭定時(shí)任務(wù)的經(jīng)典開(kāi)源實(shí)現(xiàn),這里講述一下如何在SpringBoot2.6.3集成quartz,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-02-02
  • Java多種方法實(shí)現(xiàn)合并多個(gè)list對(duì)象列表

    Java多種方法實(shí)現(xiàn)合并多個(gè)list對(duì)象列表

    Java編程中,合并多個(gè)列表對(duì)象可以通過(guò)Stream?API或傳統(tǒng)循環(huán)方式實(shí)現(xiàn),使用Stream?API合并時(shí),利用flatMap方法將嵌套的List展平,再通過(guò)collect方法收集成一個(gè)新的列表,傳統(tǒng)循環(huán)則通過(guò)創(chuàng)建一個(gè)空的ArrayList,并通過(guò)遍歷每個(gè)列表將元素添加進(jìn)去
    2024-09-09
  • spring 操作elasticsearch查詢使用方法

    spring 操作elasticsearch查詢使用方法

    本篇文章主要介紹了spring 操作elasticsearch使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 一種類似JAVA線程池的C++線程池實(shí)現(xiàn)方法

    一種類似JAVA線程池的C++線程池實(shí)現(xiàn)方法

    線程池(thread pool)是一種線程使用模式。線程過(guò)多或者頻繁創(chuàng)建和銷毀線程會(huì)帶來(lái)調(diào)度開(kāi)銷,進(jìn)而影響緩存局部性和整體性能。這篇文章主要介紹了一種類似JAVA線程池的C++線程池實(shí)現(xiàn)方法,需要的朋友可以參考下
    2019-07-07
  • Java面向接口編程之簡(jiǎn)單工廠模式示例

    Java面向接口編程之簡(jiǎn)單工廠模式示例

    這篇文章主要介紹了Java面向接口編程之簡(jiǎn)單工廠模式,結(jié)合實(shí)例形式詳細(xì)分析了java面向接口編程簡(jiǎn)單工廠模式的具體定義與使用方法,需要的朋友可以參考下
    2019-09-09
  • 解決PageHelper的上下文問(wèn)題導(dǎo)致SQL查詢結(jié)果不正確

    解決PageHelper的上下文問(wèn)題導(dǎo)致SQL查詢結(jié)果不正確

    主要介紹了PageHelper在使用過(guò)程中出現(xiàn)的分頁(yè)上下文問(wèn)題,并分析了可能的原因和解決方案,主要解決方案包括每次分頁(yè)查詢后調(diào)用`PageHelper.clearPage()`清理分頁(yè)上下文,確保每次查詢前正確調(diào)用`startPage`,以及避免在條件判斷未執(zhí)行SQL時(shí)影響后續(xù)查詢
    2024-12-12
  • IDEA?中使用?Hudi的示例代碼

    IDEA?中使用?Hudi的示例代碼

    這篇文章主要介紹了IDEA?中使用?Hudi的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 解決SpringBoot運(yùn)行報(bào)錯(cuò):找不到或無(wú)法加載主類的問(wèn)題

    解決SpringBoot運(yùn)行報(bào)錯(cuò):找不到或無(wú)法加載主類的問(wèn)題

    這篇文章主要介紹了解決SpringBoot運(yùn)行報(bào)錯(cuò):找不到或無(wú)法加載主類的問(wèn)題,具有很好的參考價(jià)值,對(duì)大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Java三大特性之繼承詳解

    Java三大特性之繼承詳解

    繼承:就是子類繼承父類的屬性和行為,使得子類對(duì)象具有與父類相同的屬性、相同的行為。本文將來(lái)和大家詳細(xì)說(shuō)說(shuō)Java中的繼承,需要的可以了解一下
    2022-10-10
  • Java中Collections.sort()排序方法舉例詳解

    Java中Collections.sort()排序方法舉例詳解

    很多時(shí)候都需要對(duì)一些數(shù)據(jù)進(jìn)行排序的操作,這篇文章主要給大家介紹了關(guān)于Java中Collections.sort()方法舉例詳解的相關(guān)資料,使用Collections.sort()可以使用其sort()方法來(lái)對(duì)List、Set等集合進(jìn)行排序,需要的朋友可以參考下
    2024-02-02

最新評(píng)論

西贡区| 于都县| 澄城县| 阳春市| 辽宁省| 中西区| 秭归县| 咸宁市| 利川市| 明溪县| 玉林市| 大足县| 铁岭县| 白山市| 玉林市| 乐安县| 灵璧县| 枣庄市| 河间市| 武鸣县| 青田县| 长顺县| 长葛市| 安义县| 方山县| 文化| 陇西县| 武鸣县| 华阴市| 新野县| 上高县| 吉林省| 温宿县| 文成县| 页游| 咸丰县| 温泉县| 布尔津县| 霍林郭勒市| 正安县| 四子王旗|