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

springboot的切面應(yīng)用方式(注解Aspect)

 更新時間:2024年11月14日 09:41:16   作者:你是豬,  
文章總結(jié):Spring?Boot提供了三種攔截器:Filter、Interceptor和Aspect,Filter主要用于內(nèi)容過濾和非登錄狀態(tài)的非法請求過濾,無法獲取Spring框架相關(guān)的信息,Interceptor可以在獲取請求類名、方法名的同時,獲取請求參數(shù),但無法獲取參數(shù)值

spring boot 攔截的方式

1.過濾器filter

可以獲取http、http請求和響應(yīng),但無法獲取與spring框架相關(guān)的信息,如哪個control處理,哪個方法處理,有哪些參數(shù),這些都是無法獲取的。

主要用于內(nèi)容上的過濾,敏感字替換成*等,也可用于非登入狀態(tài)的非法請求過濾。

2.攔截器interceptor

除了獲取http、http請求和響應(yīng)對象,還可以獲取請求的類名、方法名,但攔截器無法獲取請求參數(shù)的值,從DispatcherServlet類源碼分析。

主要用于對公共的一些攔截獲取,例如請求的IP 地址,IP黑白名單里的過過濾,非登入狀態(tài)的接口請求攔截。

3.切面攔截Aspect

能獲取到方法請求的參數(shù),方法名,以及方法返回的json數(shù)據(jù),更多的是用于數(shù)據(jù)的處理,比如對操作進行記錄,修改,新建,查詢,審批等操作記錄進行處理統(tǒng)計。

對返回的json中的一些特殊數(shù)據(jù),比如字典值替換成對應(yīng)的數(shù)據(jù),避免前端轉(zhuǎn)化,等等。

執(zhí)行順序

  • 正常情況:過濾器、攔截器、切片,
  • 異常報錯:切片、ControllerAdvice注解類、攔截器、過濾器

切片的使用

相關(guān)注解

(1)@Pointcut 注解:

指定一個切點,定義需要攔截的東西,這里介紹兩個常   用的表達(dá)式:一個是使用 execution(),另一個是使用 annotation()。

  • execution表達(dá)式:

以 execution(* com.mutest.controller..*.*(..))) 表達(dá)式為例:

  • 第一個 * 號的位置:表示返回值類型,* 表示所有類型。包名:表示需要攔截的包名,后面的兩個句*斜體樣式*點表示當(dāng)前包和當(dāng)前包的所有子包,在本例中指 com.mutest.controller包、子包下所有類的方法。
  • 第二個 * *號的位置:表示類名,** 表示所有類。
  • (..):*這個星號表示方法名*,* 表示所有的方法,后面括弧里面表示方法的參數(shù),兩個句點表示任何參數(shù)。

annotation() 表達(dá)式:

annotation() 方式是針對某個注解來定義切點,其中注解包括GetMapping等

(2)@Around注解:

 用于修飾Around增強處理,Around增強處理非常強大,表現(xiàn)在:

 @Around可以自由選擇增強動作與目標(biāo)方法的執(zhí)行順序,也就是說可以在增強動作前后,甚至過程中執(zhí)行目標(biāo)方法。這個特性的實現(xiàn)在于,調(diào)用 ProceedingJoinPoint參數(shù)的procedd()方法才會執(zhí)行目標(biāo)方法。

 @Around可以改變執(zhí)行目標(biāo)方法的參數(shù)值,也可以改變執(zhí)行目標(biāo)方法之后的返回值。

(3)@Before 注解:

指定的方法在切面切入目標(biāo)方法之前執(zhí)行,可以做一些 Log 處理,也可以做一些信息的統(tǒng)計,可以通過參數(shù)JointPoint 來獲取一些有用的信息,可以用它來獲取一個簽名,利用簽名可以獲取請求的包名、方法名,包括參數(shù)(通過joinPoint. getArgs() 獲?。┑取?/p>

(4)@After注解:

和before注解相對應(yīng)的注解,同樣可以進行一些日志處理等

(5)@AfterReturning 注解:

和@After 有些類似,區(qū)別在于 @AfterReturning 注解可以用來捕獲切入方法執(zhí)行完之后的返回值,對返回值進行業(yè)務(wù)邏輯上的增強處理。

對返回的json字符串進行處理。

(6)@@AfterThrowing注解:

當(dāng)被切方法執(zhí)行過程中拋出異常時,會進入 @AfterThrowing 注解的方法中執(zhí)行,在該方法中可以做一些異常的處理邏輯。

示例

import com.alibaba.fastjson.JSONObject;
import com.cmhit.crm.constants.FunctionEnum;
import com.cmhit.crm.service.OperateLogService;
import com.cmhit.crm.utils.JsonUtil;
import com.cmhit.crm.vo.operlog.OperateLogCreateReqVO;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Objects;

@Slf4j
@Aspect
@Component
public class OperateLogAspect {
   
   //操作日志service
   @Autowired 
   private OperateLogService operateLogService;
  //操作日志實體
   private OperateLogCreateReqVO operateLog = new OperateLogCreateReqVO();

   // 定義一個切入點
   @Pointcut("execution(* com.cmhit.crm.controller.*.*(..))")
   public void operlog(){
      //這里面不要寫代碼,不會執(zhí)行的
   }

   // 前置通知
   @Before(value = "operlog()")
   public void before(JoinPoint jp) {
       //方法名獲取
       String name = jp.getSignature().getName();
       //方法參數(shù)獲取
       Object[] args = jp.getArgs();
       //設(shè)置操作日志
       setOperateLogType(name,args);
       log.debug("{}方法開始執(zhí)行...開始設(shè)置設(shè)置操作日志的操作類型",name);
   }

   // 后置通知
   @After(value = "operlog()")
   public void after(JoinPoint jp) {
       String name = jp.getSignature().getName();
       log.debug("{}方法執(zhí)行結(jié)束...",name);
   }

   // 返回通知
   @AfterReturning(value = "operlog()")
   public void afterReturning(JoinPoint jp) {
       String name = jp.getSignature().getName();
       if (Objects.nonNull(operateLog.getSourceId())) {
           operateLog.setOperationResult("操作成功!");
           operateLogService.insertOperateLog(operateLog);
       }
       log.debug("{}方法執(zhí)行成功",name);
   }

   // 異常通知
   @AfterThrowing(value = "operlog()", throwing = "e")
   public void afterThrowing(JoinPoint jp, Exception e) {
       String name = jp.getSignature().getName();
       if (Objects.nonNull(operateLog.getSourceId())){
           operateLog.setOperationResult(e.getMessage());
           operateLogService.insertOperateLog(operateLog);
       }
       log.debug("{}方法拋異常,異常是{}",name , e.getMessage());
   }

   // 環(huán)繞通知
   @Around("operlog()")
   public Object around(ProceedingJoinPoint pjp) throws Throwable {
       String name = pjp.getSignature().getName();
       // 統(tǒng)計方法執(zhí)行時間
      long start = System.currentTimeMillis();
      Object result = pjp.proceed();
      long end = System.currentTimeMillis();
      System.out.println(name + "方法執(zhí)行時間為:" + (end - start) + " ms");
       return result;
   }
   private void setOperateLogType(String name,Object[] args){
     //公司的業(yè)務(wù)邏輯,這里建立使用自己的
    }

   }
   //參數(shù)處理方法
   private void dealGetinfoArgs(Object[] args){
    //自己寫邏輯吧
   }
  

}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot整合MyBatis和SpringBoot整合MyBatis-Plus教程

    SpringBoot整合MyBatis和SpringBoot整合MyBatis-Plus教程

    這篇文章主要介紹了SpringBoot整合MyBatis和SpringBoot整合MyBatis-Plus教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)貪心算法的實現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)貪心算法的實現(xiàn)

    本文主要介紹了Java數(shù)據(jù)結(jié)構(gòu)貪心算法的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2007-03-03
  • SpringBoot獲取配置文件的簡單實現(xiàn)方法

    SpringBoot獲取配置文件的簡單實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于SpringBoot如何獲取配置文件的簡單實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • SpringBoot集成itext導(dǎo)出PDF的過程

    SpringBoot集成itext導(dǎo)出PDF的過程

    本文介紹了如何在Spring Boot中集成iText庫導(dǎo)出PDF文件,并解決中文亂碼問題,步驟包括添加依賴、準(zhǔn)備字體、打開系統(tǒng)字體目錄選擇字體、在控制器中新增方法、創(chuàng)建并測試UserPdfExportService類,以及添加請求頭,感興趣的朋友一起看看吧
    2024-11-11
  • Java中一個線程執(zhí)行死循環(huán)有什么后果

    Java中一個線程執(zhí)行死循環(huán)有什么后果

    這篇文章主要為大家詳細(xì)介紹了Java中一個線程執(zhí)行死循環(huán)有什么后果,當(dāng)一個線程在執(zhí)行死循環(huán)時會影響另外一個線程嗎,下面為大家揭曉
    2016-05-05
  • Java?Guava的使用技巧整理

    Java?Guava的使用技巧整理

    Guava是Google發(fā)布的一個開源庫,主要提供了一些在Java開發(fā)中非常有用的工具類和API,不管是工作還是學(xué)習(xí)都是非常值得我們?nèi)ナ煜さ?,一起來看看?/div> 2023-03-03
  • Java vector的詳解及實例

    Java vector的詳解及實例

    這篇文章主要介紹了Java vector的詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Spring??AOP的兩種使用方法

    Spring??AOP的兩種使用方法

    這篇文章主要介紹了Spring?AOP的兩種使用方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Java靜態(tài)代理和動態(tài)代理詳解

    Java靜態(tài)代理和動態(tài)代理詳解

    這篇文章主要介紹了Java靜態(tài)代理和動態(tài)代理,本文通過代碼示例給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-11-11
  • 史上最全面的Spring Boot配置文件深入講解

    史上最全面的Spring Boot配置文件深入講解

    Springboot極大的簡化了Spring框架的使用配置流程,在核心配置文件里,幾乎可以完成所有的配置工作,下面這篇文章主要給大家介紹了關(guān)于Spring Boot配置文件的相關(guān)資料,文中介紹的非常全面,需要的朋友可以參考下
    2018-12-12

最新評論

湘阴县| 景宁| 安阳县| 清水河县| 高密市| 兴义市| 寿宁县| 辉县市| 广汉市| 凤翔县| 翁牛特旗| 呼伦贝尔市| 香港| 香港| 怀安县| 肇源县| 崇明县| 房山区| 宜兰县| 怀集县| 杭州市| 彩票| 日土县| 巫山县| 肇源县| 思茅市| 武鸣县| 左权县| 黄冈市| 景宁| 巴彦县| 常宁市| 道真| 会昌县| 富宁县| 曲阳县| 江山市| 女性| 龙游县| 化州市| 绥德县|