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

spring-AOP 及 AOP獲取request各項參數(shù)操作

 更新時間:2021年07月19日 17:09:38   作者:wkCaeser_  
這篇文章主要介紹了spring-AOP 及 AOP獲取request各項參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

spring-AOP 及 AOP獲取request各項參數(shù)

AOP稱為面向切面編程,在程序開發(fā)中主要用來解決一些系統(tǒng)層面上的問題,比如日志,事務(wù),權(quán)限等待。

一、AOP的基本概念

  • Aspect(切面):通常是一個類,里面可以定義切入點和通知
  • JointPoint(連接點):程序執(zhí)行過程中明確的點,一般是方法的調(diào)用
  • Advice(通知):AOP在特定的切入點上執(zhí)行的增強處理,有before,after,afterReturning,afterThrowing,around
  • Pointcut(切入點):就是帶有通知的連接點,在程序中主要體現(xiàn)為書寫切入點表達式
  • AOP代理:AOP框架創(chuàng)建的對象,代理就是目標(biāo)對象的加強。Spring中的AOP代理可以使JDK動態(tài)代理,也可以是CGLIB代理,前者基于接口,后者基于子類

二、Spring AOP

Spring中的AOP代理還是離不開Spring的IOC容器,代理的生成,管理及其依賴關(guān)系都是由IOC容器負責(zé),Spring默認使用JDK動態(tài)代理,在需要代理類而不是代理接口的時候,Spring會自動切換為使用CGLIB代理,不過現(xiàn)在的項目都是面向接口編程,所以JDK動態(tài)代理相對來說用的還是多一些。

三、基于注解的AOP配置方式

1.啟用@AsjectJ支持

在spring配置中配置下面一句:

<aop:aspectj-autoproxy />

或者使用注解:

@EnableAspectJAutoProxy

2.通知類型介紹

(1) Before:在目標(biāo)方法被調(diào)用之前做增強處理,@Before只需要指定切入點表達式即可

(2) AfterReturning:在目標(biāo)方法正常完成后做增強,@AfterReturning除了指定切入點表達式后,還可以指定一個返回值形參名returning,代表目標(biāo)方法的返回值

(3) AfterThrowing:主要用來處理程序中未處理的異常,@AfterThrowing除了指定切入點表達式后,還可以指定一個throwing的返回值形參名,可以通過該形參名

來訪問目標(biāo)方法中所拋出的異常對象

(4) After:在目標(biāo)方法完成之后做增強,無論目標(biāo)方法時候成功完成。@After可以指定一個切入點表達式

(5) Around:環(huán)繞通知,在目標(biāo)方法完成前后做增強處理,環(huán)繞通知是最重要的通知類型,像事務(wù),日志等都是環(huán)繞通知,注意編程中核心是一個ProceedingJoinPoint

3.通知執(zhí)行的優(yōu)先級

進入目標(biāo)方法時,先織入Around,再織入Before,退出目標(biāo)方法時,先織入Around,再織入AfterReturning,最后才織入After。

注意:Spring AOP的環(huán)繞通知會影響到AfterThrowing通知的運行,不要同時使用!同時使用也沒啥意義。

4.切入點的定義和表達式

切入點表達式的定義算是整個AOP中的核心,有一套自己的規(guī)范

Spring AOP支持的切入點指示符:

execution:用來匹配執(zhí)行方法的連接點

A:@Pointcut(“execution(* com.aijava.springcode.service….(…))”)

第一個表示匹配任意的方法返回值,…(兩個點)表示零個或多個,上面的第一個…表示service包及其子包,第二個表示所有類,第三個*表示所有方法,第二個…表示

方法的任意參數(shù)個數(shù)

B:@Pointcut(“within(com.aijava.springcode.service.*)”)

within限定匹配方法的連接點,上面的就是表示匹配service包下的任意連接點

C:@Pointcut(“this(com.aijava.springcode.service.UserService)”)

this用來限定AOP代理必須是指定類型的實例,如上,指定了一個特定的實例,就是UserService

D:@Pointcut(“bean(userService)”)

bean也是非常常用的,bean可以指定IOC容器中的bean的名稱

下面是一個使用AOP獲取統(tǒng)計計算方法執(zhí)行時間以及獲取request請求參數(shù)等信息的log方法:

/**
 * description:
 * 統(tǒng)計請求執(zhí)行時間
 *
 * @author wkGui
 */
@Component
@Aspect
public class ResExeTimeCounter {
    private static Logger logger = LoggerFactory.getLogger(ResExeTimeCounter.class);
    @Pointcut("execution(* com.wk.controller..*.*(..))")
    public void pointCut() {
    }
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        assert sra != null;
        HttpServletRequest request = sra.getRequest();
        String url = request.getRequestURL().toString();
        String method = request.getMethod();
        String queryString = request.getQueryString();
        long startTime = System.currentTimeMillis();
        logger.info("{url:{}, method:{}, queryString:{}}", url, method, queryString);
        Object rs;
        boolean successAble = false;
        JsonObject paramsJson = new JsonObject();
        try {
            Object[] params = pjp.getArgs();
            for (int i = 0; i < params.length; i++) {
                if (params[i] instanceof BindingResult
                        || params[i] instanceof HttpRequest
                        || params[i] instanceof HttpResponse){
                    continue;
                }
                paramsJson.addProperty("param-" + i, JsonUtil.toJsonWtihNullField(params[i]));
            }
            rs = pjp.proceed();
            successAble = true;
        } finally {
            logger.info("{url:{}, method:{}, success-able:{}, exe-time:{}, params:{}}", url, method, successAble, System.currentTimeMillis() - startTime, paramsJson);
        }
        return rs;
    }
}

SpringAOP獲取request中所有參數(shù),記錄用戶操作日志

今天搞了一個AOP的管理日志,蛋疼的很....

老規(guī)矩貼代碼吧

首先除了aop的包以外需要這三個包。

自行度娘。

如果想切入controllers,請將這個代碼寫入你的mvc配置中,糾結(jié)了一上午切不進去就是這個原因.

method為你切入類的方法名

可以照這個打個模版出來,PS:無視注釋哈,逼死強迫癥

因為我的控制類里面只會有兩個參數(shù)request和response ,所以我這里request就直接等于了下標(biāo)為0,

下面的

  Enumeration parameter = request.getParameterNames();
  while(parameter.hasMoreElements()) {
  String a=(String) parameter.nextElement();
  System.out.println(request.getParameter(a));
  }

可以獲取從頁面上傳過來的所有參數(shù)以及參數(shù)名,參數(shù):request.getParameter(a),參數(shù)名:a

上面的代碼放在aop中實測可以,但如果放在攔截器中,實測會返回一個date,不知道什么鬼,get請求的話偶爾會正常。post一定不正常,aop中無問題

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

相關(guān)文章

  • springboot webflux 過濾器(使用RouterFunction實現(xiàn))

    springboot webflux 過濾器(使用RouterFunction實現(xiàn))

    這篇文章主要介紹了springboot webflux 過濾器(使用RouterFunction實現(xiàn)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 深入淺析springboot中static和templates區(qū)別

    深入淺析springboot中static和templates區(qū)別

    這篇文章主要介紹了springboot中static和templates區(qū)別,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Spring?security?oauth2以redis作為tokenstore及jackson序列化失敗問題

    Spring?security?oauth2以redis作為tokenstore及jackson序列化失敗問題

    這篇文章主要介紹了Spring?security?oauth2以redis作為tokenstore及jackson序列化失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教<BR>
    2024-04-04
  • Java設(shè)計模式編程之工廠方法模式的使用

    Java設(shè)計模式編程之工廠方法模式的使用

    這篇文章主要介紹了Java設(shè)計模式編程之工廠方法模式的使用,工廠方法模式屬于設(shè)計模式中三種工廠模式中的一種,需要的朋友可以參考下
    2016-02-02
  • 理解 MyBatis 是如何在 Spring 容器中初始化的

    理解 MyBatis 是如何在 Spring 容器中初始化的

    這篇文章主要介紹了理解 MyBatis 是如何在 Spring 容器中初始化的,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • RocketMQ?offset確認機制示例詳解

    RocketMQ?offset確認機制示例詳解

    這篇文章主要為大家介紹了RocketMQ?offset確認機制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • SpringBoot使用validation做參數(shù)校驗說明

    SpringBoot使用validation做參數(shù)校驗說明

    這篇文章主要介紹了SpringBoot使用validation做參數(shù)校驗說明,首先通過添加hibernate-validator展開全文內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考與喜愛
    2022-04-04
  • java 使用DecimalFormat進行數(shù)字的格式化實例詳解

    java 使用DecimalFormat進行數(shù)字的格式化實例詳解

    這篇文章主要介紹了java 使用DecimalFormat進行數(shù)字的格式化實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • java線程池詳解及代碼介紹

    java線程池詳解及代碼介紹

    這篇文章主要介紹了java中線程池的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • maven的pom.xml中profiles的作用詳解

    maven的pom.xml中profiles的作用詳解

    這篇文章主要介紹了maven的pom.xml中profiles的作用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論

乌拉特中旗| 罗山县| 金昌市| 临清市| 沙湾县| 南开区| 黄大仙区| 丹东市| 瑞丽市| 尚义县| 米脂县| 延川县| 兴文县| 浠水县| 宁阳县| 增城市| 海盐县| 望江县| 马鞍山市| 青浦区| 玉树县| 新邵县| 潞城市| 凯里市| 延津县| 铁力市| 涡阳县| 吐鲁番市| 波密县| 田阳县| 涿鹿县| 万宁市| 开原市| 恩平市| 库尔勒市| 凤凰县| 车致| 遂宁市| 手游| 潼南县| 成安县|