国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java Spring 通過 AOP 實現方法參數的重新賦值、修改方法參數的取值

這篇具有很好參考價值的文章主要介紹了Java Spring 通過 AOP 實現方法參數的重新賦值、修改方法參數的取值。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

AOP 依賴

我創(chuàng)建的項目項目為 SpringBoot 項目

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.3</version>
    </parent>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

String 類型參數

這里以對前端傳遞過來的加密數據進行解密為例

注解

import java.lang.annotation.*;

/**
 * 標注需要進行 RSA 加密算法解密的通用注解。
 * 該注解可以使用在類上、方法上、方法參數上、字段/屬性上、局部變量上
 */
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DecodeRsaCommonAnnotation {
}
import java.lang.annotation.*;

/**
 * 標注需要進行 RSA 加密算法解密的方法參數的注解。
 * 該注解可以使用在方法參數上
 */
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DecodeRsaParameterAnnotation {
}

控制器方法

    @GetMapping("/test")
    @DecodeRsaCommonAnnotation
    public void test(
            @DecodeRsaParameterAnnotation
            String text
    ) {
        System.out.println(text);
    }

方式一:通過環(huán)繞通知實現 [個人比較推薦]

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Aspect
@Order(1)
@Component
public class DecodeRsaAspect {

    /**
     * DecodeRsaAspect 的切點為被 @DecodeRsaCommonAnnotation 標記的位置
     */
    @Pointcut("@annotation(cn.org.xiaoweiba.graduationdesign.bookmall.annotation.rsa.DecodeRsaCommonAnnotation)")
    public void pointCut() {
    }

    /**
     * 采用 Rsa 加密算法進行解密
     *
     * @param proceedingJoinPoint 切點
     */
    @Around("pointCut()")
    public Object decodeRsaAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
        Object returnVal = null;
        try {
            // 獲取切點方法的參數
            Object[] args = proceedingJoinPoint.getArgs();
            // 中間處理 ...
            // 對切點方法的參數進行重新賦值
            for (int i = 0; i < args.length; i++) {
                args[i] = "RSA 加密算法解密后的數據";
            }
            // 執(zhí)行切點方法,并傳遞重新賦值后的參數列表
            returnVal = proceedingJoinPoint.proceed(args);
        } catch (Throwable e) {
            // 異常處理 ...
        }
        // 返回切點方法執(zhí)行后的返回值
        return returnVal;
    }

}

spring aop 獲得參數修改,小尾巴的編程知識星球,java,spring,開發(fā)語言
spring aop 獲得參數修改,小尾巴的編程知識星球,java,spring,開發(fā)語言

方式二:通過前置通知 + 反射實現

Java ReflectUtil 反射相關的工具類

由于 JDK 8 中有關反射相關的功能自從 JDK 9 開始就已經被限制了,如:通過反射修改 String 類型變量的 value 字段(final byte[]),所以要能夠使用運行此方法,需要在運行項目時,添加虛擬機(VM)選項:--add-opens java.base/java.lang=ALL-UNNAMED,開啟默認不被允許的行為

通過反射修改 String 類型對象 value 取值的工具方法

獲取指定對象中的指定字段(不包含父類中的字段)

    /**
     * 獲取指定對象中的指定字段(不包含父類中的字段)。
     * 此方法在獲取指定對象中的指定字段時,會包證獲取的指定字段能夠被訪問。
     *
     * @param object 要獲取字段的指定對象
     * @param fieldName 要獲取的指定字段的名稱
     * @return 指定對象中的指定字段
     */
    public static Field getField(Object object, String fieldName) throws NoSuchFieldException {
        // 獲取指定對象的 Class
        Class<?> objectClass = object.getClass();
        // 獲取指定對象中的指定字段
        Field declaredField = objectClass.getDeclaredField(fieldName);
        // 保證獲取的指定字段能夠被訪問
        declaredField.setAccessible(true);
        return declaredField;
    }

通過反射為字符串對象的 value 字段重新賦值為 strValue

    /**
     * 通過反射為字符串對象的 value 字段重新賦值為 strValue,
     * 從而保證不修改字符串對象的引用,并且能夠修改字符串的取值
     * 由于 JDK 8 中有關反射相關的功能自從 JDK 9 開始就已經被限制了,所以要能夠使用運行此方法,
     * 需要在運行項目時,添加虛擬機(VM)選項:--add-opens java.base/java.lang=ALL-UNNAMED
     * 開啟默認不被允許的行為
     *
     * @param str 需要進行重新賦值的字符串對象
     * @param strValue 要賦值給字符串對象的值
     */
    public static void setValueString(String str, String strValue) throws NoSuchFieldException, IllegalAccessException {
        // 獲取字符串的 value 字段
        Field strValueField = getField(str, "value");
        // 為字符串對象的 value 字段重新賦值
        // strValueField.set(str, strValue.getBytes(StandardCharsets.UTF_8)); 不要使用該種方法,會出現亂碼
        // 采用如下方式,獲取 strValue 的 value 字段值,將其賦值給 str 的 value 字段
        strValueField.set(str, strValueField.get(strValue));
    }
切面類
import cn.org.xiaoweiba.graduationdesign.bookmall.utils.ReflectUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Aspect
@Order(1)
@Component
public class DecodeRsaAspect {

    /**
     * DecodeRsaAspect 的切點為被 @DecodeRsaCommonAnnotation 標記的位置
     */
    @Pointcut("@annotation(cn.org.xiaoweiba.graduationdesign.bookmall.annotation.rsa.DecodeRsaCommonAnnotation)")
    public void pointCut() {
    }

    /**
     * 采用 Rsa 加密算法進行解密
     *
     * @param joinPoint 切點
     */
    @Before("pointCut()")
    public void decodeRsaBeforeAdvice(JoinPoint joinPoint) {
        try {
            // 獲取切點方法的參數
            Object[] args = joinPoint.getArgs();
            // 中間處理 ...
            // 對切點方法的參數進行重新賦值
            for (int i = 0; i < args.length; i++) {
                // 對字符串對象的 value 字段重新賦值,不修改字符串對象的指向,保證修改的為切點方法的字符串對象參數
                ReflectUtil.setValueString((String) args[i], "解密后的數據");
            }
        } catch (Throwable e) {
            // 異常處理 ...
        }
    }

}

spring aop 獲得參數修改,小尾巴的編程知識星球,java,spring,開發(fā)語言
spring aop 獲得參數修改,小尾巴的編程知識星球,java,spring,開發(fā)語言
spring aop 獲得參數修改,小尾巴的編程知識星球,java,spring,開發(fā)語言
spring aop 獲得參數修改,小尾巴的編程知識星球,java,spring,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-763552.html

到了這里,關于Java Spring 通過 AOP 實現方法參數的重新賦值、修改方法參數的取值的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • java 對象List中對象的某一屬性重新賦值

    描述: 在我們開發(fā)過程中經常會遇到在拿到一個對象list集合的時候回對某一個字段重新賦值,比如:在無任務下面的若干子任務,開始執(zhí)行主任務對子任務的狀態(tài)統(tǒng)一設置待執(zhí)行。這個時候就需要使用 Java8 stream 或者 List forEach 這兩種方式來實現,方便快捷,也不需要再遍歷

    2024年02月12日
    瀏覽(32)
  • 微信小程序內頁跳轉登錄,登錄完成后攜帶參數重新回到之前頁面實現方法

    第一步:在app.js或utils.js中添加以下兩個方法: 第二步:在跳轉到登錄頁面跳轉前調用setCallbackUrl方法(獲當前頁面的路徑和參數存本地),登錄頁面登錄成功后調用getCallBackUrl方法(提取之前存的路徑和參數返回),如果沒有就在catch中執(zhí)行登錄后的正常邏輯,比如跳轉到默

    2024年02月02日
    瀏覽(89)
  • SpringBoot 使用【AOP 切面+注解】實現在請求調用 Controller 方法前修改請求參數和在結果返回之前修改返回結果

    在項目中需要實現 在請求調用 Controller 方法前修改請求參數和在結果返回之前修改返回結果 。 我們可以使用 AOP 切面+注解的形式實現。這樣我們就可以在不修改原始代碼的情況下,通過切面類在方法調用前后插入額外的邏輯。 自定義注解 @PreProcess 自定義注解 @PreProcess 用于

    2024年03月20日
    瀏覽(38)
  • Java8 stream、List forEach 遍歷對象 List 對某一字段重新賦值

    Java8 stream、List forEach 遍歷對象 List 對某一字段重新賦值 經常會需要遍歷對象 List 對某一字段重新賦值,使用 Java8 stream 或者 List forEach 操作實現非常便捷。 一、Java8 stream 操作 示例代碼如下: 二、List forEach 操作 示例代碼如下: 將 Object 替換為需要提取的對象即可。 遍歷對象

    2024年02月16日
    瀏覽(23)
  • uniapp返回上一級頁面,傳參,上一級通過參數重新請求數據

    uniapp返回上一級頁面,傳參,上一級通過參數重新請求數據

    小程序navigateback傳值_微信小程序 wx.navigateBack() 返回頁面如何傳遞參數 - 文章...-CSDN博客 ? 當前頁面 ? 上一級頁面 ?

    2024年02月19日
    瀏覽(19)
  • 【Vue3】Vue3中reactive變量重新賦值無法響應的三種處理方法(已解決)

    【Vue3】Vue3中reactive變量重新賦值無法響應的三種處理方法(已解決)

    1、html 2、定義reactive變量 3、重新賦值 ? 1、html 2、定義ref變量 3、賦值 第三種方案:push(不推薦)

    2024年02月15日
    瀏覽(29)
  • 【Spring Boot】通過AOP攔截Spring Boot日志并將其存入數據庫

    【Spring Boot】通過AOP攔截Spring Boot日志并將其存入數據庫

    在軟件開發(fā)中,常常需要記錄系統(tǒng)運行時的日志。日志記錄有助于排查系統(tǒng)問題、優(yōu)化系統(tǒng)性能、監(jiān)控操作行為等。本文將介紹如何使用Spring Boot和AOP技術實現攔截系統(tǒng)日志并保存到數據庫中的功能。 本文將通過以下步驟實現攔截系統(tǒng)日志并保存到數據庫中的功能: 配置數據

    2024年02月10日
    瀏覽(21)
  • Spring AOP(AOP概念、組成、Spring AOP實現及實現原理)

    Spring AOP(AOP概念、組成、Spring AOP實現及實現原理)

    學習 Spring AOP 之前,先要了解 AOP 是什么 AOP(Aspect Oriented Programming):面向切面編程,它和 OOP(面向對象編程)類似。 它是一種思想, 是對某一類事情的集中處理。 比如用戶登錄權限的效驗,在學習 AOP 之前,在需要判斷用戶登錄的頁面,都要各自實現或調用用戶驗證的方

    2024年02月02日
    瀏覽(23)
  • Java spring Aop實戰(zhàn)

    Java spring Aop實戰(zhàn)

    Spring AOP 1. 實戰(zhàn) 1.實戰(zhàn) 創(chuàng)建工程和依賴 數據庫建表 實體類 Mapper 接口 方法一 方法二 Service 包 接口1: 實現接口 Mapper Mapper 1 Mapper 2 配置xml文件 Xml 1 Xml 2 Spring 配置文件 Mybatis配置文件 測試類 數據庫結果 測試2 測試3 不符合業(yè)務邏輯,加入事物 頭文件 只能在service實現類加 重

    2024年02月15日
    瀏覽(29)
  • Java | 使用切面AOP攔截并修改Controller接口請求參數

    Java | 使用切面AOP攔截并修改Controller接口請求參數

    關注common wx: CodingTechWork ??在開發(fā)過程中,會有一些需求將controller層的一些方法入參進行全量轉換,最容易想到的可能是在調用下層service方法時,調用公共的方法進行入參轉換,這時帶來的唯一問題就是代碼不雅觀,比較冗余。那還有什么方法可以更優(yōu)雅的解決這個問題

    2024年01月24日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包