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

Java | 使用切面AOP攔截并修改Controller接口請(qǐng)求參數(shù)

這篇具有很好參考價(jià)值的文章主要介紹了Java | 使用切面AOP攔截并修改Controller接口請(qǐng)求參數(shù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

關(guān)注common wx: CodingTechWork

引言

??在開發(fā)過程中,會(huì)有一些需求將controller層的一些方法入?yún)⑦M(jìn)行全量轉(zhuǎn)換,最容易想到的可能是在調(diào)用下層service方法時(shí),調(diào)用公共的方法進(jìn)行入?yún)⑥D(zhuǎn)換,這時(shí)帶來的唯一問題就是代碼不雅觀,比較冗余。那還有什么方法可以更優(yōu)雅的解決這個(gè)問題嗎?答案是有的:切面。
??我們實(shí)現(xiàn)一個(gè)AOP切面程序,對(duì)入?yún)⒅械男柁D(zhuǎn)換的參數(shù)進(jìn)行專項(xiàng)轉(zhuǎn)換,而無需在各個(gè)controller層的各個(gè)方法中進(jìn)行轉(zhuǎn)換處理。

實(shí)踐

controller類

package com.test.selfcoding.controller;

import com.test.selfcoding.bean.PersonBean;
import com.test.selfcoding.service.HelloWorldService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @Description controller
 * @Author Liao Jy
 * @Date 2023/6/28
 */
@RestController
@RequestMapping("/hello/world")
public class HelloWorldController {

    @Autowired
    private HelloWorldService helloWorldService;

    @GetMapping("/test1")
    public String testGetHelloWorld() {
        return helloWorldService.getHelloWolrd();
    }

    @PostMapping("/test2")
    public String testPostHelloWord(@RequestBody PersonBean personBean) {
        return helloWorldService.postHelloWorld(personBean);
    }

    @GetMapping("/test3")
    public String testPostHelloWord(@RequestParam String personName) {
        return personName + ", hi world!";
    }

}

切面類

package com.test.selfcoding.aspect;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;

/**
 * @Description DefaultArgumentsAspect
 * @Author LiaoJy
 * @Date 2023/6/28
 */

@Component
@Aspect
@Slf4j
public class DefaultArgumentsAspect {
    @Before(value = "execution(* com.test.selfcoding.controller..*(..))")
    public void doBefore(JoinPoint joinPoint) {
        try {
        	//獲取入?yún)⒘斜?/span>
            Object[] args = joinPoint.getArgs();
            log.info("args: {}", JSON.toJSONString(args));
            //入?yún)⑴锌?/span>
            if (null == args || args.length == 0) {
                log.info("no fields!");
                return;
            }
            //獲取第一個(gè)入?yún)ⅲㄖ饕槍?duì)@RequestBody,一般只會(huì)有一個(gè)入?yún)?,若遇到多個(gè)@RequestParam,需循環(huán)處理)
            Object arg = args[0];
            //獲取字段域
            Field[] fields = arg.getClass().getDeclaredFields();
            log.info("getDeclaredFields: {}", JSON.toJSONString(fields));
			//判斷入?yún)⒅惺欠裼?name"
            if (Arrays.stream(fields).noneMatch(item -> "name".equals(item.getName()))) {
                log.info("no name field!");
                return;
            }
            //入?yún)⒅杏?name",獲取該字段
            Field field = arg.getClass().getDeclaredField("name");
            //判斷是否可使用
            boolean accessible = ((!Modifier.isPublic(field.getModifiers())
                    || !Modifier.isPublic(field.getDeclaringClass().getModifiers())
                    || Modifier.isFinal(field.getModifiers())) && !field.isAccessible());
            //若不可用,則需要進(jìn)行setAccessible
            if (accessible) {
                ServletRequestAttributes attributes
                        = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                // 獲取request對(duì)象
                HttpServletRequest request = attributes.getRequest();
                log.info("method name: {}", request.getRequestURI());
                field.setAccessible(true);
                //將name參數(shù)替換為system
                field.set(arg, "system");
            }
        } catch (Exception e) {
            log.error("切面參數(shù)設(shè)置異常", e);
        }
    }
}

驗(yàn)證

無參測(cè)試接口1

  1. 接口調(diào)用
    java 通過切面攔截請(qǐng)求參數(shù),JAVA核心技術(shù),java,開發(fā)語言
  2. 控制臺(tái)日志
2023-06-28 18:06:06.060  INFO 6495 --- [nio-8001-exec-1] c.t.s.aspect.DefaultArgumentsAspect      : args: []
2023-06-28 18:06:06.061  INFO 6495 --- [nio-8001-exec-1] c.t.s.aspect.DefaultArgumentsAspect      : no fields!
2023-06-28 18:06:06.066  INFO 6495 --- [nio-8001-exec-1] c.t.s.s.impl.HelloWorldServiceImpl       : getHelloWolrd() get str success.
result: hugh, hello world!
  1. 結(jié)果分析
    未獲取到參數(shù),正常走接口。打印no fields!,無需轉(zhuǎn)換參數(shù)。

不包含指定參數(shù)測(cè)試接口2

  1. 接口調(diào)用
    java 通過切面攔截請(qǐng)求參數(shù),JAVA核心技術(shù),java,開發(fā)語言

  2. 控制臺(tái)日志文章來源地址http://www.zghlxwxcb.cn/news/detail-820435.html

2023-06-28 18:08:04.040  INFO 6495 --- [nio-8001-exec-5] c.t.s.aspect.DefaultArgumentsAspect      : args: ["xiaowang"]
2023-06-28 18:08:04.055  INFO 6495 --- [nio-8001-exec-5] c.t.s.aspect.DefaultArgumentsAspect      : getDeclaredFields: [{"accessible":false,"annotatedType":{"annotatedGenericComponentType":{"annotations":[],"declaredAnnotations":[],"type":"char"},"annotations":[],"declaredAnnotations":[],"type":"[C"},"annotations":[],"declaringClass":"java.lang.String","enumConstant":false,"genericType":"[C","modifiers":18,"name":"value","synthetic":false,"type":"[C"},{"accessible":false,"annotatedType":{"annotations":[],"declaredAnnotations":[],"type":"int"},"annotations":[],"declaringClass":"java.lang.String","enumConstant":false,"genericType":"int","modifiers":2,"name":"hash","synthetic":false,"type":"int"},{"accessible":false,"annotatedType":{"annotations":[],"declaredAnnotations":[],"type":"long"},"annotations":[],"declaringClass":"java.lang.String","enumConstant":false,"genericType":"long","modifiers":26,"name":"serialVersionUID","synthetic":false,"type":"long"},{"accessible":false,"annotatedType":{"annotatedGenericComponentType":{"annotations":[],"declaredAnnotations":[],"type":"java.io.ObjectStreamField"},"annotations":[],"declaredAnnotations":[],"type":"[Ljava.io.ObjectStreamField;"},"annotations":[],"declaringClass":"java.lang.String","enumConstant":false,"genericType":"[Ljava.io.ObjectStreamField;","modifiers":26,"name":"serialPersistentFields","synthetic":false,"type":"[Ljava.io.ObjectStreamField;"},{"accessible":false,"annotatedType":{"annotatedActualTypeArguments":[{"annotations":[],"declaredAnnotations":[],"type":"java.lang.String"}],"annotations":[],"declaredAnnotations":[],"type":{"actualTypeArguments":["java.lang.String"],"rawType":"java.util.Comparator","typeName":"java.util.Comparator<java.lang.String>"}},"annotations":[],"declaringClass":"java.lang.String","enumConstant":false,"genericType":{"$ref":"$[4].annotatedType.type"},"modifiers":25,"name":"CASE_INSENSITIVE_ORDER","synthetic":false,"type":"java.util.Comparator"}]
2023-06-28 18:08:04.056  INFO 6495 --- [nio-8001-exec-5] c.t.s.aspect.DefaultArgumentsAspect      : no name field!
  1. 結(jié)果分析
    未獲取到指定的參數(shù),正常走接口。打印no name field!,無需轉(zhuǎn)換參數(shù)。

包含指定參數(shù)測(cè)試接口3

  1. 接口調(diào)用
    java 通過切面攔截請(qǐng)求參數(shù),JAVA核心技術(shù),java,開發(fā)語言

  2. 控制臺(tái)日志

2023-06-28 18:10:15.481  INFO 6495 --- [nio-8001-exec-9] c.t.s.aspect.DefaultArgumentsAspect      : args: [{"age":1,"name":"xiaohong"}]
2023-06-28 18:10:15.482  INFO 6495 --- [nio-8001-exec-9] c.t.s.aspect.DefaultArgumentsAspect      : getDeclaredFields: [{"accessible":false,"annotatedType":{"annotations":[],"declaredAnnotations":[],"type":"java.lang.String"},"annotations":[],"declaringClass":"com.test.selfcoding.bean.PersonBean","enumConstant":false,"genericType":"java.lang.String","modifiers":2,"name":"name","synthetic":false,"type":"java.lang.String"},{"accessible":false,"annotatedType":{"annotations":[],"declaredAnnotations":[],"type":"int"},"annotations":[],"declaringClass":"com.test.selfcoding.bean.PersonBean","enumConstant":false,"genericType":"int","modifiers":2,"name":"age","synthetic":false,"type":"int"}]
2023-06-28 18:10:15.482  INFO 6495 --- [nio-8001-exec-9] c.t.s.aspect.DefaultArgumentsAspect      : method name: /hello/world/test2
  1. 結(jié)果分析
    獲取到指定的參數(shù),進(jìn)行name值替換為system,切面轉(zhuǎn)換參數(shù)成功。

到了這里,關(guān)于Java | 使用切面AOP攔截并修改Controller接口請(qǐng)求參數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java 設(shè)置免登錄請(qǐng)求接口被攔截問題

    Java 設(shè)置免登錄請(qǐng)求接口被攔截問題

    1、在設(shè)置免登錄時(shí),前端將請(qǐng)求的路由添加到白名單后,請(qǐng)求接口還是被攔截到了,將請(qǐng)求接口也設(shè)置后還是會(huì)被攔截跳轉(zhuǎn)到登錄頁(yè)面 ?通過JAVA? ?注解 @Anonymous? 進(jìn)行設(shè)置匿名訪問就可以了

    2024年02月09日
    瀏覽(20)
  • Spring Boot 自定義注解,AOP 切面統(tǒng)一打印出入?yún)⒄?qǐng)求日志

    Spring Boot 自定義注解,AOP 切面統(tǒng)一打印出入?yún)⒄?qǐng)求日志

    今天主要說說如何通過自定義注解的方式,在 Spring Boot 中來實(shí)現(xiàn) AOP 切面統(tǒng)一打印出入?yún)⑷罩?。小伙伴們可以收藏一波?廢話不多說,進(jìn)入正題! 在看看實(shí)現(xiàn)方法之前,我們先看下切面日志輸出效果咋樣: 從上圖中可以看到,每個(gè)對(duì)于每個(gè)請(qǐng)求,開始與結(jié)束一目了然,并且

    2024年02月08日
    瀏覽(22)
  • Controller層自定義注解攔截request請(qǐng)求校驗(yàn)

    Controller層自定義注解攔截request請(qǐng)求校驗(yàn)

    一、背景 筆者工作中遇到一個(gè)需求,需要開發(fā)一個(gè)注解,放在controller層的類或者方法上,用以校驗(yàn)請(qǐng)求參數(shù)中(不管是url還是body體內(nèi),都要檢查,有token參數(shù),且符合校驗(yàn)規(guī)則就放行)是否傳了一個(gè)token的參數(shù),并且token符合一定的生成規(guī)則,符合就不予攔截,放行請(qǐng)求,否則

    2024年01月17日
    瀏覽(28)
  • JAVA:面向切面編程AOP

    ? ? ? ? 把某一些功能提取出來與某一對(duì)象進(jìn)行隔離,提取之后可以對(duì)某哥單方面的功能進(jìn)行修改和擴(kuò)展 ? ? ? ? 也就是把眾多方法中的的所有公共代碼抽取出來,放到某個(gè)地方集中管理 ????????對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行了隔離,從而降低業(yè)務(wù)邏輯各部分之間的耦合,

    2024年02月07日
    瀏覽(17)
  • Java注解方式實(shí)現(xiàn)aop,切點(diǎn)切面實(shí)戰(zhàn)

    Java注解方式實(shí)現(xiàn)aop,切點(diǎn)切面實(shí)戰(zhàn)

    注解方式實(shí)現(xiàn)aop我們主要分為如下幾個(gè)步驟(有更好的方法的話,歡迎交流): 1.在切面類(為切點(diǎn)服務(wù)的類)前用@Aspect注釋修飾,聲明為一個(gè)切面類。 2.用@Pointcut注釋聲明一個(gè)切點(diǎn),目的是為了告訴切面,誰是它的服務(wù)對(duì)象。(此注釋修飾的方法的方法體為空,不需要寫功

    2024年02月12日
    瀏覽(19)
  • 【Java 初級(jí)】Spring核心之面向切面編程(AOP)

    【Java 初級(jí)】Spring核心之面向切面編程(AOP)

    tip:作為程序員一定學(xué)習(xí)編程之道,一定要對(duì)代碼的編寫有追求,不能實(shí)現(xiàn)就完事了。我們應(yīng)該讓自己寫的代碼更加優(yōu)雅,即使這會(huì)費(fèi)時(shí)費(fèi)力。 ???? 推薦: 體系化學(xué)習(xí)Java(Java面試專題) AOP(面向切面編程)是一種編程范式,用于將橫切關(guān)注點(diǎn)(如日志記錄、性能統(tǒng)計(jì)等

    2024年02月04日
    瀏覽(27)
  • Spring Boot框架中Controller層API接口如何支持使用多個(gè)@RequestBody注解接受請(qǐng)求體參數(shù)

    Spring Boot框架中Controller層API接口如何支持使用多個(gè)@RequestBody注解接受請(qǐng)求體參數(shù)

    眾所周知,在Spring Boot框架中,Controller層API接口編碼獲取請(qǐng)求體參數(shù)時(shí),在參數(shù)上會(huì)使用@RequestBody注解;如果一次請(qǐng)求中,請(qǐng)求體參數(shù)攜帶的內(nèi)容需要用多個(gè)參數(shù)接收時(shí),能不能多次使用@RequestBody注解呢? 下面我們先測(cè)試一下,參考代碼: PostMan進(jìn)行請(qǐng)求: 服務(wù)端后端日志:

    2024年01月17日
    瀏覽(22)
  • Java AOP 通過注解實(shí)現(xiàn)切面及通過注解改變返回值

    學(xué)習(xí)過java的小伙伴都知道Spring的重要知識(shí)點(diǎn)之一就是AOP,AOP也就是切面編程,切面編程它能夠幫助我們實(shí)現(xiàn)非侵入式的功能增強(qiáng),解耦現(xiàn)有的業(yè)務(wù)邏輯和要新增的功能增強(qiáng)。 實(shí)際應(yīng)用中的場(chǎng)景 事務(wù)管理、攔截器、日志處理、權(quán)限控制等。 AOP的增強(qiáng)方式 前置增強(qiáng)、后置增強(qiáng)

    2024年02月14日
    瀏覽(23)
  • 【JavaEE】面向切面編程AOP是什么-Spring AOP框架的基本使用

    【JavaEE】面向切面編程AOP是什么-Spring AOP框架的基本使用

    【JavaEE】 AOP(1) 1.1 AOP 與 Spring AOP AOP ( A spect O riented P rogramming),是一種思想,即 面向切面編程 Spring AOP 則是一個(gè)框架,Spring項(xiàng)目中需要引入依賴而使用 AOP和Spring AOP的關(guān)系就相當(dāng)于IoC和DI Spring AOP讓開發(fā)者能夠半自動(dòng)的開發(fā)AOP思想下實(shí)現(xiàn)的功能 1.2 沒有AOP的世界是怎樣的

    2024年02月11日
    瀏覽(29)
  • 1、springboot中使用AOP切面完成全局日志

    1、springboot中使用AOP切面完成全局日志 可選擇在控制臺(tái)輸出日志或者收集日志信息存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)中 1、在配置 AOP 切面之前,我們需要了解下 aspectj 相關(guān)注解的作用: @Aspect :作用是把當(dāng)前類標(biāo)識(shí)為一個(gè)切面、供容器讀取 @Pointcut :(哪些方法或者類需要進(jìn)行AOP織入)定義一個(gè)

    2024年02月02日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包