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

SpringBoot 攔截器妙用你真的了解嗎

 更新時(shí)間:2021年07月01日 11:32:17   作者:陳皮的JavaLib  
關(guān)于springboot攔截器很多朋友掌握的不是多好,今天抽空給大家普及下這方面的知識(shí),SpringBoot 攔截器妙用,讓你一個(gè)人開發(fā)整個(gè)系統(tǒng)的鑒權(quán)模塊,快來跟小編一起學(xué)習(xí)下吧

HandlerInterceptor 詳解

HandlerInterceptor 允許定制 handler 處理器執(zhí)行鏈的工作流接口。我們可以自定義攔截器用于攔截 handlers 處理器(你可以理解為 controller 層的接口),從而可以添加一些共同的重復(fù)性的處理行為(例如接口鑒權(quán),接口日志記錄,性能監(jiān)控等),而不用修改每一個(gè) handler 的實(shí)現(xiàn)。

注意,此基于 SpringBoot 2.3.12.RELEASE 版本講解。

HandlerInterceptor 接口只有三個(gè)默認(rèn)空實(shí)現(xiàn)方法,在低版本中這三個(gè)方法不是默認(rèn)方法,而是抽象方法。

public interface HandlerInterceptor {

	default boolean preHandle(HttpServletRequest request, HttpServletResponse response,                 Object handler) throws Exception {
		return true;
	}

	default void postHandle(HttpServletRequest request, HttpServletResponse response,                 Object handler, @Nullable ModelAndView modelAndView) throws Exception {
	}

	default void afterCompletion(HttpServletRequest request, HttpServletResponse response,             Object handler, @Nullable Exception ex) throws Exception {
	}
}

這三個(gè)方法的執(zhí)行順序圖如下:

在這里插入圖片描述

preHandle

preHandle 前置處理,攔截一個(gè)處理器(handler)的執(zhí)行,preHandle 方法會(huì)在 HandlerMapping 確定一個(gè)適當(dāng)?shù)奶幚砥鲗?duì)象之后,但在 HandlerAdapter 調(diào)用處理器之前被調(diào)用。可以簡(jiǎn)單理解為 controller 接口被調(diào)用之前執(zhí)行。

Intercepter 是鏈?zhǔn)降?,就是一個(gè)接著一個(gè)執(zhí)行。如果此方法返回 true,則會(huì)執(zhí)行下一個(gè)攔截器或者直接執(zhí)行處理器。如果此方法返回 false 或者拋出異常則終止執(zhí)行鏈,也不再調(diào)用處理器。

注意,此方法如果不返回 true,那么 postHandleafterCompletion 不會(huì)被執(zhí)行。

那這個(gè)方法有什么用呢?其實(shí)可以做一些接口被調(diào)用前的預(yù)處理,例如用戶權(quán)限校驗(yàn)。

package com.chenpi;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * @Description 用戶權(quán)限驗(yàn)證攔截
 * @Author 陳皮
 * @Date 2021/6/27
 * @Version 1.0
 */
@Component
public class UserPermissionInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler) {

        if (handler instanceof HandlerMethod) {

            HandlerMethod handlerMethod = (HandlerMethod) handler;

            // 獲取用戶權(quán)限校驗(yàn)注解
            UserAuthenticate userAuthenticate =
                    handlerMethod.getMethod().getAnnotation(UserAuthenticate.class);
            if (null == userAuthenticate) {
                userAuthenticate = handlerMethod.getMethod().getDeclaringClass()
                        .getAnnotation(UserAuthenticate.class);
            }
            if (userAuthenticate != null && userAuthenticate.permission()) {
                // 驗(yàn)證用戶信息
                UserContext userContext = userContextManager.getUserContext(request);
                if (null == userContext) {
                    return false;
                }
            }
        }
        return true;
    }
}

postHandle

postHandle 后置處理,會(huì)在 HandlerAdapter 調(diào)用處理器之后,但在 DispatcherServlet 渲染視圖之前被調(diào)用??梢栽诖藢?duì) ModelAndView 做一些額外的處理??梢院?jiǎn)單理解為 controller 接口被調(diào)用之后執(zhí)行。

注意,此方法在執(zhí)行鏈中的執(zhí)行順序是倒著執(zhí)行的,即先聲明的攔截器后執(zhí)行。

afterCompletion

afterCompletion 完成之后,在請(qǐng)求處理完之后被執(zhí)行,也就是渲染完視圖之后。一般用于做一些資源的清理工作,配合 preHandle 計(jì)算接口執(zhí)行時(shí)間等。

注意,和 postHandle 一樣,此方法在執(zhí)行鏈中的執(zhí)行順序也是倒著執(zhí)行的,即先聲明的攔截器后執(zhí)行。

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                            Object handler, @Nullable Exception ex) {
    // 請(qǐng)求完后,清除當(dāng)前線程的用戶信息
    UserContextHolder.removeUserContext();
}

注冊(cè)攔截器

注意,我們自定義的攔截器要通過 WebMvcConfigurer 的實(shí)現(xiàn)類進(jìn)行注冊(cè),才能生效。

package com.yzj.ehr.common.config;

import com.yzj.ehr.common.context.UserContextResolver;
import org.springframework.stereotype.Component;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.yzj.ehr.common.interceptor.UserPermissionInterceptor;

/**
 * @Description 注冊(cè)攔截器
 * @Author 陳皮
 * @Date 2021/6/27
 * @Version 1.0
 */
@Component
public class WebAppConfigurer implements WebMvcConfigurer {

    private UserPermissionInterceptor userPermissionInterceptor;

    public WebAppConfigurer(final UserPermissionInterceptor userPermissionInterceptor) {
        this.userPermissionInterceptor = userPermissionInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 匹配所有接口,排除/base/test接口
        registry.addInterceptor(userPermissionInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/base/test");
    }
}

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

相關(guān)文章

  • SpringBoot進(jìn)行參數(shù)校驗(yàn)的方法詳解

    SpringBoot進(jìn)行參數(shù)校驗(yàn)的方法詳解

    在日常的接口開發(fā)中,為了防止非法參數(shù)對(duì)業(yè)務(wù)造成影響,經(jīng)常需要對(duì)接口的參數(shù)進(jìn)行校驗(yàn)。本文通過示例詳細(xì)講解了SpringBoot如何進(jìn)行參數(shù)校驗(yàn)的,感興趣的可以學(xué)習(xí)一下
    2022-04-04
  • Spring bean為什么需要依賴注入

    Spring bean為什么需要依賴注入

    本篇文章主要介紹了Spring依賴注入的三種方式小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-07-07
  • 一篇文章教你使用枚舉來實(shí)現(xiàn)java單例模式

    一篇文章教你使用枚舉來實(shí)現(xiàn)java單例模式

    本篇文章主要介紹了Java實(shí)現(xiàn)單例的3種普遍的模式,餓漢式、懶漢式、枚舉式。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-07-07
  • springboot mybatis里localdatetime序列化問題的解決

    springboot mybatis里localdatetime序列化問題的解決

    這篇文章主要介紹了springboot mybatis里localdatetime序列化問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10
  • Feign Client 超時(shí)時(shí)間配置不生效的解決

    Feign Client 超時(shí)時(shí)間配置不生效的解決

    這篇文章主要介紹了Feign Client 超時(shí)時(shí)間配置不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口

    Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口

    這篇文章主要給大家介紹了關(guān)于Spring Cloud實(shí)戰(zhàn)技巧之使用隨機(jī)端口的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • SpringBoot?docker項(xiàng)目部署實(shí)戰(zhàn)

    SpringBoot?docker項(xiàng)目部署實(shí)戰(zhàn)

    本文主要介紹了SpringBoot?docker項(xiàng)目部署實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Java SpringMVC的自定義異常類

    Java SpringMVC的自定義異常類

    這篇文章主要為大家詳細(xì)介紹了SpringMVC的自定義異常類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • java代碼實(shí)現(xiàn)斗地主發(fā)牌功能

    java代碼實(shí)現(xiàn)斗地主發(fā)牌功能

    這篇文章主要介紹了java實(shí)現(xiàn)斗地主發(fā)牌功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Mybatis結(jié)果集映射與生命周期詳細(xì)介紹

    Mybatis結(jié)果集映射與生命周期詳細(xì)介紹

    結(jié)果集映射指的是將數(shù)據(jù)表中的字段與實(shí)體類中的屬性關(guān)聯(lián)起來,這樣 MyBatis 就可以根據(jù)查詢到的數(shù)據(jù)來填充實(shí)體對(duì)象的屬性,幫助我們完成賦值操作
    2022-10-10

最新評(píng)論

黄浦区| 泰宁县| 白山市| 棋牌| 汤原县| 广灵县| 南木林县| 万年县| 从化市| 仲巴县| 金坛市| 喀什市| 浙江省| 河东区| 凭祥市| 德清县| 凉城县| 汉寿县| 金坛市| 沾化县| 上林县| 泽库县| 阿合奇县| 漳州市| 平昌县| 池州市| 巨鹿县| 崇阳县| 高尔夫| 电白县| 兴城市| 文登市| 和平区| 禹城市| 迭部县| 绵竹市| 泽州县| 仪陇县| 太仓市| 宝清县| 砀山县|