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

SpringBoot中間件之封裝統(tǒng)一白名單配置

 更新時(shí)間:2023年07月10日 14:33:07   作者:看表該更新博客了  
這篇文章主要介紹了SpringBoot中間件封裝統(tǒng)一白名單配置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

背景

上線初期提供可配置的白名單用戶進(jìn)行訪問驗(yàn)證,把控整體運(yùn)行風(fēng)險(xiǎn)。

解決痛點(diǎn):

APOLLO企業(yè)控制也可以,多個(gè)業(yè)務(wù)功能,要配置多個(gè)apollo,如ASwitch,BSwitch,這樣會(huì)非常耗時(shí)耗力,而且等功能穩(wěn)定,要放開企業(yè)/用戶限制時(shí),只能將APOLLO的值置為空串或者某個(gè)特殊值(已表示對(duì)全部企業(yè)/用戶放開),日后會(huì)殘留在代碼里。

方案設(shè)計(jì)

白名單屬于業(yè)務(wù)系統(tǒng)開發(fā)過程中可重復(fù)使用的通用功能,所以我們把這樣的工具型功能提煉為技術(shù)組件,各個(gè)需要的使用此功能的系統(tǒng)引入此組件。

技術(shù)點(diǎn)

自定義注解、切面和springboot讀取配置文件的處理

代碼實(shí)現(xiàn)

1.切面

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DoWhiteList {
    /**
     * key:當(dāng)前接口入?yún)⑿枰崛〉膶傩?
     * @return
     */
    String key() default "";
    /**
     * returnJson: 攔截用戶請(qǐng)求后返回的提示msg
     * @return
     */
    String returnJson() default "";
}

擴(kuò)展

@Retention(RetentionPolicy.RUNTIME)

 @Target(ElementType.METHOD)

字如其名,目標(biāo),即自定義注解DoWhiteList是要作用在類、接口還是方法上

2.配置類

/**
 * @ConfigurationProperties:用于創(chuàng)建指定前綴的自定義配置信息,這樣就在ymL或者properties中讀取到配置信息
 */
@ConfigurationProperties("com.whitelist")
public class WhiteListProperties {
    private String users;
    public String getUsers() {
        return users;
    }
    public void setUsers(String users) {
        this.users = users;
    }
}
/**
 *
 * @ConditionalOnMissingBean
 *  只會(huì)實(shí)例化一個(gè)Bean對(duì)象
 */
@Configuration
@EnableConfigurationProperties(WhiteListProperties.class)
public class WhiteListAutoConfigure {
    @Bean("whiteListConfig")
    @ConditionalOnMissingBean
    public String whiteListConfig(WhiteListProperties properties) {
        return properties.getUsers();
    }
}

3.切面

@Aspect
@Component
public class DoJoinPoint {
    private Logger logger = LoggerFactory.getLogger(DoJoinPoint.class);
    @Resource
    private String whiteListConfig;
    @Pointcut("@annotation(cn.bugstack.middleware.whitelist.annotation.DoWhiteList)")
    public void aopPoint() {
    }
    @Around("aopPoint()")
    public Object doRouter(ProceedingJoinPoint jp) throws Throwable {
        // 獲取內(nèi)容
        Method method = getMethod(jp);
        DoWhiteList whiteList = method.getAnnotation(DoWhiteList.class);
        // 獲取字段值
        String keyValue = getFiledValue(whiteList.key(), jp.getArgs());
        logger.info("middleware whitelist handler method:{} value:{}", method.getName(), keyValue);
        if (null == keyValue || "".equals(keyValue)) return jp.proceed();
        String[] split = whiteListConfig.split(",");
        // 白名單過濾
        for (String str : split) {
            if (keyValue.equals(str)) {
                return jp.proceed();
            }
        }
        // 攔截
        return returnObject(whiteList, method);
    }
    private Method getMethod(JoinPoint jp) throws NoSuchMethodException {
        Signature sig = jp.getSignature();
        MethodSignature methodSignature = (MethodSignature) sig;
        return jp.getTarget().getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes());
    }
    // 返回對(duì)象
    private Object returnObject(DoWhiteList whiteList, Method method) throws IllegalAccessException, InstantiationException {
        Class<?> returnType = method.getReturnType();
        String returnJson = whiteList.returnJson();
        if ("".equals(returnJson)) {
            return returnType.newInstance();
        }
        return JSON.parseObject(returnJson, returnType);
    }
    // 獲取屬性值
    private String getFiledValue(String filed, Object[] args) {
        String filedValue = null;
        for (Object arg : args) {
            try {
                if (null == filedValue || "".equals(filedValue)) {
                    filedValue = BeanUtils.getProperty(arg, filed);
                } else {
                    break;
                }
            } catch (Exception e) {
                if (args.length == 1) {
                    return args[0].toString();
                }
            }
        }
        return filedValue;
    }
}

測(cè)試

白名單中只允許userId為123的訪問

 測(cè)試場(chǎng)景一

        userId為123:

切面攔截判斷該userid在白名單配置中,放行

 測(cè)試場(chǎng)景二

        userId為【非123】:

切面攔截判斷該userid不在白名單配置中,攔截

總結(jié)

日后每上線一個(gè)新功能/接口,用該注解可以實(shí)現(xiàn)批量梯度控制訪問來把控整體運(yùn)行風(fēng)險(xiǎn),等功能穩(wěn)定后,將該注解干掉即可。

到此這篇關(guān)于SpringBoot中間件——封裝統(tǒng)一白名單配置的文章就介紹到這了,更多相關(guān)SpringBoot白名單配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot中集成各種日志框架Logback、Log4j2和Java Util Logging的步驟和示例代碼

    Spring Boot中集成各種日志框架Logback、Log4j2和Java Util 

    這篇文章主要介紹了Spring Boot中集成各種日志框架Logback、Log4j2和Java Util Logging,通過實(shí)例代碼介紹了集成Logback、Log4j2和Java Util Logging的基本步驟,你可以根據(jù)自己的需求進(jìn)行配置和擴(kuò)展,以滿足更復(fù)雜的日志需求,需要的朋友可以參考下
    2023-11-11
  • Struts2中ognl遍歷數(shù)組,list和map方法詳解

    Struts2中ognl遍歷數(shù)組,list和map方法詳解

    這篇文章主要介紹了Struts2中ognl遍歷數(shù)組,list和map方法詳解,需要的朋友可以參考下。
    2017-09-09
  • MySQL數(shù)據(jù)文件直接通過拷貝備份與恢復(fù)的操作方法

    MySQL數(shù)據(jù)文件直接通過拷貝備份與恢復(fù)的操作方法

    這篇文章主要介紹了MySQL數(shù)據(jù)文件直接通過拷貝備份與恢復(fù)的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Java?流處理之收集器詳解

    Java?流處理之收集器詳解

    這篇文章主要介紹了Java?流處理之收集器,本文以記錄?Record?為例,結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • springboot如何集成Swagger2

    springboot如何集成Swagger2

    這篇文章主要介紹了springboot集成Swagger2的方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-12-12
  • Spring中@Async的使用小結(jié)

    Spring中@Async的使用小結(jié)

    在Java開發(fā)中,我們常常會(huì)遇到需要執(zhí)行耗時(shí)操作的場(chǎng)景,例如文件上傳、網(wǎng)絡(luò)請(qǐng)求等,本文將介紹如何在Java中使用異步方法,并探討其中的一些注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • java實(shí)現(xiàn)高效下載文件的方法

    java實(shí)現(xiàn)高效下載文件的方法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)高效下載文件的幾種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java基數(shù)排序radix sort原理及用法解析

    Java基數(shù)排序radix sort原理及用法解析

    這篇文章主要介紹了Java基數(shù)排序radix sort原理及用法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot實(shí)現(xiàn)Logback輸出日志到Kafka方式

    SpringBoot實(shí)現(xiàn)Logback輸出日志到Kafka方式

    本文介紹了如何在SpringBoot應(yīng)用中通過自定義Appender實(shí)現(xiàn)Logback輸出日志到Kafka,包括配置maven依賴、Kafka工具類和logback.xml配置
    2025-02-02
  • java處理轉(zhuǎn)義字符↑ → ↓ 保存后的展示還原操作

    java處理轉(zhuǎn)義字符↑ → ↓ 保存后的展示還原操作

    這篇文章主要介紹了java處理轉(zhuǎn)義字符↑ → ↓ 保存后的展示還原操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

宝鸡市| 镇安县| 武定县| 甘肃省| 若尔盖县| 教育| 宜昌市| 信宜市| 民县| 尼木县| 来凤县| 中宁县| 岫岩| 遂平县| 阳泉市| 泰州市| 垫江县| 田阳县| 北流市| 都江堰市| 安平县| 宝应县| 哈尔滨市| 信阳市| 罗平县| 湟中县| 仙居县| 莱西市| 响水县| 南开区| 绥德县| 焉耆| 井陉县| 浮梁县| 探索| 漾濞| 中山市| 泗洪县| 黄大仙区| 雅安市| 加查县|