当前位置: 移动技术网 > IT编程>开发语言>Java > Spring Boot使用AOP在控制台打印请求、响应信息

Spring Boot使用AOP在控制台打印请求、响应信息

2019年02月21日  | 移动技术网IT编程  | 我要评论

aop称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等。

aop简介

aop全称aspect oriented programming,面向切面,aop主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。其与设计模式完成的任务差不多,是提供另一种角度来思考程序的结构,来弥补面向对象编程的不足。

  通俗点讲就是提供一个为一个业务实现提供切面注入的机制,通过这种方式,在业务运行中将定义好的切面通过切入点绑定到业务中,以实现将一些特殊的逻辑绑定到此业务中。

  比如,现在需要打印请求、响应信息,很多地方有需要,这时候又不能把代码复制一遍,所有需要aop来实现。

常用注解说明

@aspect -- 作用是把当前类标识为一个切面供容器读取
@pointcut -- (切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
@before -- 标识一个前置增强方法,相当于beforeadvice的功能
@afterreturning -- 后置增强,相当于afterreturningadvice,方法退出时执行
@afterthrowing -- 异常抛出增强,相当于throwsadvice
@after -- final增强,不管是抛出异常或者正常退出都会执行
@around -- 环绕增强,相当于methodinterceptor

pom.xml中引入aop的jar包

<!-- aop -->
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-aop</artifactid>
</dependency>
        <!-- fastjson -->
<dependency>
    <groupid>com.alibaba</groupid>
    <artifactid>fastjson</artifactid>
    <version>1.2.47</version>
</dependency>

切面类代码

package com.example.hellospringboot.aop;

import com.alibaba.fastjson.json;
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.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.context.annotation.configuration;
import org.springframework.web.context.request.requestattributes;
import org.springframework.web.context.request.requestcontextholder;
import org.springframework.web.context.request.servletrequestattributes;

import javax.servlet.http.httpservletrequest;

/**
 * 切面 打印请求、返回参数信息
 */
@aspect // 定义一个切面
@configuration
public class logrecordaspect {
    private static final logger logger = loggerfactory.getlogger(logrecordaspect.class);

    // 定义切点pointcut
    @pointcut("execution(* com.example.hellospringboot.controller.*controller.*(..))")
    public void excudeservice() {
    }

    @around("excudeservice()")
    public object doaround(proceedingjoinpoint pjp) throws throwable {
        requestattributes ra = requestcontextholder.getrequestattributes();
        servletrequestattributes sra = (servletrequestattributes) ra;
        httpservletrequest request = sra.getrequest();

        string method = request.getmethod();
        string uri = request.getrequesturi();
        string parastring = json.tojsonstring(request.getparametermap());
        logger.info("***************************************************");
        logger.info("请求开始, uri: {}, method: {}, params: {}", uri, method, parastring);

        // result的值就是被拦截方法的返回值
        object result = pjp.proceed();
        logger.info("请求结束,controller的返回值是 " + json.tojsonstring(result));
        return result;
    }
}

测试打印结果

浏览器分别访问 http://www.lhsxpumps.com/_localhost:8080/hello?a=1&b=2 和http://localhost:8080/hello?c=11&d=22,控制台打印结果如下:

***************************************************
请求开始, uri: /hello, method: get, params: {"a":["1"],"b":["2"]}
请求结束,controller的返回值是 "hello spring boot!"
***************************************************
请求开始, uri: /hello, method: get, params: {"c":["11"],"d":["22"]}
请求结束,controller的返回值是 "hello spring boot!"

下面的是我的公众号二维码图片,欢迎关注,欢迎留言,一起学习,一起进步。

java碎碎念公众号java碎碎念公众号

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网