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

SpringBoot(11)AOP切入方法在不改變Controller任何代碼的情況下獲取額外參數(shù)

這篇具有很好參考價值的文章主要介紹了SpringBoot(11)AOP切入方法在不改變Controller任何代碼的情況下獲取額外參數(shù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

有一個Controller的方法addw(int name){},返回值為void,映射路徑是/addw,前端傳入的參數(shù)有name、id、age,現(xiàn)在希望在不改變Controller的方法的前提下,使用AOP切入一個新的方法addall(),此時,addall方法可以獲取的參數(shù)為name,有沒有什么辦法,在不改變Controller任何代碼的情況下獲取到id、age

在不改變Controller代碼的情況下,addall方法無法直接獲取前端傳入的id、age參數(shù)。因為這些參數(shù)是通過HTTP請求的query參數(shù)或body參數(shù)傳遞的,而AOP只能攔截Controller方法的調(diào)用,無法直接攔截HTTP請求的處理過程。

但是可以通過一些技巧來實現(xiàn)在不改變Controller任何代碼的情況下獲取到id、age參數(shù),例如:

  • 使用ThreadLocal保存參數(shù):在Controller方法中將參數(shù)保存到ThreadLocal中,然后在AOP攔截的方法中獲取ThreadLocal中的參數(shù)。這種方法需要在Controller方法中加入一些額外的代碼。

  • 使用HttpServletRequest獲取參數(shù):在AOP攔截的方法中,通過HttpServletRequest對象獲取請求中的參數(shù)。這種方法不需要在Controller方法中加入額外的代碼,但需要在AOP攔截的方法中添加HttpServletRequest對象參數(shù),并且需要注意參數(shù)名與請求參數(shù)名的一致性。

使用HttpServletRequest獲取參數(shù)的解決方案進(jìn)行舉例

下面是使用HttpServletRequest獲取參數(shù)的示例代碼:

Controller方法:

@RequestMapping(value = "/addw", method = RequestMethod.POST)
public void addw(@RequestParam("name") String name) {
    // Controller方法中只獲取了name參數(shù)
    System.out.println("Controller方法中獲取的參數(shù) name:" + name);
}

AOP攔截方法:

@Around("execution(* com.example.controller.TestController.addw(..))")
public void addall(ProceedingJoinPoint joinPoint) throws Throwable {
    // 獲取HttpServletRequest對象
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    // 通過HttpServletRequest對象獲取參數(shù)
    String id = request.getParameter("id");
    String age = request.getParameter("age");
    System.out.println("AOP攔截方法中獲取的參數(shù) id:" + id);
    System.out.println("AOP攔截方法中獲取的參數(shù) age:" + age);
    // 調(diào)用Controller方法
    joinPoint.proceed();
}

在上述代碼中,AOP攔截方法中通過RequestContextHolder獲取當(dāng)前請求的HttpServletRequest對象,然后通過調(diào)用HttpServletRequest的getParameter方法獲取請求中的參數(shù)。注意需要在AOP攔截方法中添加HttpServletRequest對象參數(shù),并且需要與請求參數(shù)名一致。同時需要注意,如果請求參數(shù)名與參數(shù)類型不一致,則會出現(xiàn)參數(shù)值為null的情況。

RequestContextHolder.getRequestAttributes()沒有獲取到數(shù)據(jù)

如果RequestContextHolder.getRequestAttributes()沒有獲取到數(shù)據(jù),可能是因為在AOP攔截方法執(zhí)行的過程中,當(dāng)前線程的請求對象已經(jīng)被清除,導(dǎo)致無法獲取請求信息。這種情況通常出現(xiàn)在異步線程池等情況下。

為了解決這個問題,可以嘗試使用RequestContextHolder.getRequestAttributes()獲取請求上下文對象,并在攔截方法中進(jìn)行非空判斷。

下面是修改后的示例代碼:

@Around("execution(* com.example.controller.TestController.addw(..))")
public void addall(ProceedingJoinPoint joinPoint) throws Throwable {
    // 獲取HttpServletRequest對象
    ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    if (requestAttributes == null) {
        // 請求上下文對象為空,處理異?;蛘咧苯臃祷?/span>
        return;
    }
    HttpServletRequest request = requestAttributes.getRequest();
    // 通過HttpServletRequest對象獲取參數(shù)
    String id = request.getParameter("id");
    String age = request.getParameter("age");
    System.out.println("AOP攔截方法中獲取的參數(shù) id:" + id);
    System.out.println("AOP攔截方法中獲取的參數(shù) age:" + age);
    // 調(diào)用Controller方法
    joinPoint.proceed();
}

在上述代碼中,我們使用RequestContextHolder.getRequestAttributes()獲取請求上下文對象,并進(jìn)行非空判斷。如果獲取到的請求上下文對象為空,我們可以根據(jù)實際情況進(jìn)行異常處理或直接返回。文章來源地址http://www.zghlxwxcb.cn/news/detail-428052.html

到了這里,關(guān)于SpringBoot(11)AOP切入方法在不改變Controller任何代碼的情況下獲取額外參數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【Spring教程16】Spring框架實戰(zhàn):詳解解讀AOP配置管理中AOP切入點表達(dá)式和通知類型

    【Spring教程16】Spring框架實戰(zhàn):詳解解讀AOP配置管理中AOP切入點表達(dá)式和通知類型

    歡迎大家回到《 Java教程之Spring30天快速入門》,本教程所有示例均基于Maven實現(xiàn),如果您對Maven還很陌生,請移步本人的博文《 如何在windows11下安裝Maven并配置以及 IDEA配置Maven環(huán)境》,本文的上一篇為《 AOP的工作流程和AOP的核心概念》 前面的案例中,有涉及到如下內(nèi)容: 對于

    2024年02月04日
    瀏覽(20)
  • Spring02-Spring注解的使用、基于注解的IOC、純注解配置、整合Junit、AOP入門、基于配置文件的AOP、切入點表達(dá)式、基于配置的文件環(huán)繞通知

    學(xué)習(xí)基于注解的 IOC 配置,即注解配置 和 XML 配置要實現(xiàn)的功能都是一樣的,都是要降低程序間的耦合。只是配置的形式不一樣。 關(guān)于實際的開發(fā)中到底使用xml還是注解,每家公司有著不同的使用習(xí)慣 , 所以這兩種配置方式我們都需要掌握。 把 Spring 的 xml 配置內(nèi)容改為使用

    2024年02月03日
    瀏覽(20)
  • springboot對controller方法進(jìn)行單元測試

    單元測試有助于驗證程序的執(zhí)行邏輯是否正確。controller層的單元測試,已經(jīng)和接口測試很類似了。執(zhí)行單元測試以前,需要添加測試依賴。 1. 生成一個單元測試基礎(chǔ)類 注意需要添加的注解。 2. 沒有參數(shù)的單元測試 執(zhí)行單元測試,可以看到如下輸出: 3. 有參數(shù)的單元測試(

    2024年02月11日
    瀏覽(30)
  • SpringBoot 增強(qiáng)Controller方法,@ControllerAdvice注解的使用

    SpringBoot 增強(qiáng)Controller方法,@ControllerAdvice注解的使用

    參考資料 @ControllerAdvice 用法 SpringBoot使用@ControllerAdvice注解 @ControllerAdvice ,是Spring3.2提供的新注解,它是一個Controller增強(qiáng)器,可對controller進(jìn)行增強(qiáng)處理。 配合 @ExceptionHandler 注解,進(jìn)行全局異常處理。 配合 @InitBinder 注解,用來設(shè)置 WebDataBinder ,用于自動綁定前臺請求參數(shù)到

    2024年02月08日
    瀏覽(27)
  • springboot的MockMvc單元測試(測試controller層方法)

    springboot的MockMvc單元測試(測試controller層方法)

    所謂單元測試,即用一小段可以獨立運行的代碼,去測試一個比較底層的單獨的功能。 如果需要對controller層的方法進(jìn)行測試,那么我們可以使用springboot提供的MockMvc,模擬客戶端的請求來測試。 ???只有我們?nèi)?zhí)行測試類時,該依賴才會被加載 ? 該注解為類級別批注,該注

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

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

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

    2024年01月24日
    瀏覽(20)
  • springboot~aop方法攔截Aspect和InvocationHandler的理解

    在 Spring 中, @Autowired 注解的使用在不同的上下文中會產(chǎn)生不同的效果,這取決于所在的組件或類是否由 Spring 管理。 @Aspect 注解的使用 : @Aspect 注解通常用于聲明切面,而切面是 Spring 管理的組件。因此, @Autowired 注解可以直接用于切面類,以注入其他 Spring 托管的 bean。S

    2024年02月10日
    瀏覽(17)
  • 如何在不支持TPM.2 的電腦安裝win11

    如何在不支持TPM.2 的電腦安裝win11

    ? ? ? 使用ULTRAISO工具,將光盤目錄\\\"sourcesappraiserres.dll\\\"刪除并創(chuàng)建目錄名為\\\"appraiserres.dll\\\"的目錄. ?選擇不下載更新,下載更新可能會下載新的appraiserres.dll文件將上述的修改無效化. ? 使用U盤啟動盤(優(yōu)啟通等軟件制作...),直接加載iso文件安裝,使用這種方式好像不好會檢測安裝條

    2024年02月04日
    瀏覽(21)
  • Java AOP 通過注解實現(xiàn)切面及通過注解改變返回值

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

    2024年02月14日
    瀏覽(24)
  • springboot使用aop排除某些方法,更新從另外一張表,從另外一張表批量插入

    在Spring Boot中使用AOP時,如果想要排除某些方法不被切面所影響,可以通過使用切面表達(dá)式中的!within來實現(xiàn)。以下是一個示例: 在上面的示例中,@Before注解用于定義切面的beforeAdvice方法。execution(* com.example.service. . (…))表示切入所有com.example.service包下的方法。而!wit

    2024年02月13日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包