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

SpringBoot中使用攔截器的配置詳解

 更新時(shí)間:2024年01月15日 10:06:43   作者:Mu_Mu是一只小白  
這篇文章主要介紹了SpringBoot中使用攔截器的配置詳解,攔截器是?AOP?的一種實(shí)現(xiàn),專門攔截對(duì)動(dòng)態(tài)資源的后臺(tái)請(qǐng)求,即攔截對(duì)控制層的請(qǐng)?求,使用場(chǎng)景比較多的是判斷用戶是否有權(quán)限請(qǐng)求后臺(tái),需要的朋友可以參考下

1. 應(yīng)用場(chǎng)景

攔截器是 AOP 的一種實(shí)現(xiàn),專門攔截對(duì)動(dòng)態(tài)資源的后臺(tái)請(qǐng)求,即攔截對(duì)控制層的請(qǐng) 求。使用場(chǎng)景比較多的是判斷用戶是否有權(quán)限請(qǐng)求后臺(tái),更拔高一層的使用場(chǎng)景也有,比如攔截器可以 結(jié)合 websocket 一起使用,用來(lái)攔截 websocket 請(qǐng)求,然后做相應(yīng)的處理等等。攔截器不會(huì)攔截靜態(tài) 資源,Spring Boot 的默認(rèn)靜態(tài)目錄為 resources/static,該目錄下的靜態(tài)頁(yè)面、js、css、圖片等等, 不會(huì)被攔截.

2. 定義攔截器

定義攔截器,只需要實(shí)現(xiàn) HandlerInterceptor 接口, 該接口中有三個(gè)方法:

preHandle(……) 、 postHandle(……) 和 afterCompletion(……) 。

  • preHandle(……) 方法:該方法的執(zhí)行時(shí)機(jī)是,當(dāng)某個(gè) url 已經(jīng)匹配到對(duì)應(yīng)的 Controller 中的某個(gè)方法,且在這個(gè)方法執(zhí)行之前。所以 preHandle(……) 方法可以決定是否將請(qǐng)求放行,這是通過(guò)返回值來(lái)決定的,返回 true 則放行,返回 false 則不會(huì)向后執(zhí)行。
  • postHandle(……) 方法:該方法的執(zhí)行時(shí)機(jī)是,當(dāng)某個(gè) url 已經(jīng)匹配到對(duì)應(yīng)的 Controller 中的某個(gè)方法,且在執(zhí)行完了該方法,但是在 DispatcherServlet 視圖渲染之前。所以在這個(gè)方法中有個(gè)ModelAndView 參數(shù),可以在此做一些修改動(dòng)作。
  • afterCompletion(……) 方法:顧名思義,該方法是在整個(gè)請(qǐng)求處理完成后(包括視圖渲染)執(zhí)行,這時(shí)做一些資源的清理工作,這個(gè)方法只有在 preHandle(……) 被成功執(zhí)行后并且返回 true才會(huì)被執(zhí)行。

2.1 自定義攔截類實(shí)現(xiàn)HandlerInterceptor接口

public class MyInterceptor implements HandlerInterceptor {
    private Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        String methodName = method.getName();
        logger.info("方法{}被攔截", methodName);
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        logger.info("方法被執(zhí)行,但是視圖還未渲染");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.info("方法執(zhí)行完畢,進(jìn)行資源清理");
    }
}

2.2 實(shí)現(xiàn)WebMvcConfigurer接口進(jìn)行攔截配置

實(shí)現(xiàn)WebMvcConfigurer的這種配置會(huì)自動(dòng)過(guò)濾靜態(tài)資源;

@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

省略controller類

測(cè)試結(jié)果

10:52:16.316 [http-nio-8080-exec-1] INFO  c.e.h.interceptors.MyInterceptor - 方法test被攔截
10:52:16.344 [http-nio-8080-exec-1] INFO  c.e.h.interceptors.MyInterceptor - 方法被執(zhí)行,但是視圖還未渲染
10:52:16.344 [http-nio-8080-exec-1] INFO  c.e.h.interceptors.MyInterceptor - 方法執(zhí)行完畢,進(jìn)行資源清理

定義哪些不用攔截

取消攔截操作

如果我要攔截所有 /admin 開頭的 url 請(qǐng)求的話,需要在攔截器配置中添加這個(gè)前綴,但是 在實(shí)際項(xiàng)目中,可能會(huì)有這種場(chǎng)景出現(xiàn):某個(gè)請(qǐng)求也是 /admin 開頭的,但是不能攔截,比如 /admin/login 等等

解決方案:

1.使用excludePathPatterns("/adminUser/login")

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/adminUser/login");
    }

2.可以定義一個(gè)注解

該注解專門用來(lái)取消攔截操作,如果某個(gè) Controller 中的方法我們 不需要攔截掉,即可在該方法上加上我們自定義的注解即可,下面先定義一個(gè)注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UnInterception {
}

測(cè)試

controller類

@RestController
@RequestMapping("/intercept")
public class IntercepController {

    @UnInterception
    @RequestMapping("/hello")
    public String test() {
        return "success";
    }

interceptor攔截類

   @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        String methodName = method.getName();
        if (method.getAnnotation(UnInterception.class)!=null) {
            logger.info("方法{}不被攔截", methodName);
            return true;
        }
        logger.info("方法{}被攔截", methodName);
        return false;
    }

訪問(wèn) localhost:8080/intercept/hello

結(jié)果

11:34:24.648 [http-nio-8080-exec-1] INFO  c.e.h.interceptors.MyInterceptor - 方法test不被攔截
11:34:24.676 [http-nio-8080-exec-1] INFO  c.e.h.interceptors.MyInterceptor - 方法被執(zhí)行,但是視圖還未渲染
11:34:24.679 [http-nio-8080-exec-1] INFO  c.e.h.interceptors.MyInterceptor - 方法執(zhí)行完畢,進(jìn)行資源清理

到此這篇關(guān)于SpringBoot中使用攔截器的配置詳解的文章就介紹到這了,更多相關(guān)SpringBoot攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java上乘武功入門--反射

    java上乘武功入門--反射

    反射是Java的一種機(jī)制,一般也叫做反射機(jī)制,本文會(huì)講反射機(jī)制是什么和怎么使用,喜歡的朋友可以觀看一下,希望能給你帶來(lái)幫助
    2021-07-07
  • 淺談mybatis中SQL語(yǔ)句給boolean類型賦值問(wèn)題

    淺談mybatis中SQL語(yǔ)句給boolean類型賦值問(wèn)題

    這篇文章主要介紹了淺談mybatis中SQL語(yǔ)句給boolean類型賦值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Java實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲的完整實(shí)例

    Java實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲的完整實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java Process與Runtime()的使用及調(diào)用cmd命令阻塞的解決方案

    Java Process與Runtime()的使用及調(diào)用cmd命令阻塞的解決方案

    這篇文章主要介紹了Java Process與Runtime()的使用及調(diào)用cmd命令阻塞的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java反射與注解的詳細(xì)講解(含代碼)

    Java反射與注解的詳細(xì)講解(含代碼)

    注解和反射應(yīng)該說(shuō)是后期JAVA開發(fā)里面比較重要的技術(shù)了,通過(guò)注解和反射可以簡(jiǎn)化許許多多的操作和步驟,最重要的是為JAVA的運(yùn)行提供了更多的靈活性,這篇文章主要介紹了Java反射與注解的詳細(xì)講解,需要的朋友可以參考下
    2026-06-06
  • SpringCloud的那些中間件問(wèn)題

    SpringCloud的那些中間件問(wèn)題

    這篇文章主要介紹了SpringCloud的那些中間件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Tomcat和Spring中的事件機(jī)制深入講解

    Tomcat和Spring中的事件機(jī)制深入講解

    這篇文章主要給大家介紹了關(guān)于Tomcat和Spring中事件機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2018-12-12
  • Mybatis中TypeHandler使用小結(jié)

    Mybatis中TypeHandler使用小結(jié)

    MyBatis的TypeHandler是一個(gè)強(qiáng)大的機(jī)制,它為我們提供了一種靈活的方式來(lái)處理Java類型與數(shù)據(jù)庫(kù)類型之間的轉(zhuǎn)換,本文主要介紹了Mybatis中TypeHandler使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Java 匿名對(duì)象與匿名內(nèi)部類的使用

    Java 匿名對(duì)象與匿名內(nèi)部類的使用

    很多小伙伴對(duì)匿名對(duì)象和匿名內(nèi)部類的寫法有點(diǎn)陌生,本文主要介紹了Java 匿名對(duì)象與匿名內(nèi)部類的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 使用ObjectMapper解析json不用一直new了

    使用ObjectMapper解析json不用一直new了

    這篇文章主要為大家介紹了使用ObjectMapper解析json不用一直new了的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論

双桥区| 彭州市| 桑植县| 策勒县| 大名县| 凌海市| 大余县| 永修县| 岱山县| 青阳县| 婺源县| 莱州市| 阿城市| 博乐市| 日喀则市| 东光县| 育儿| 三穗县| 县级市| 榆社县| 云龙县| 修水县| 布尔津县| 沾益县| 双峰县| 汤原县| 宁陕县| 陆河县| 武义县| 武安市| 枝江市| 扎鲁特旗| 贞丰县| 江源县| 资兴市| 黄大仙区| 丹寨县| 土默特右旗| 郓城县| 贵南县| 南乐县|