aop 打印请求信息
项目中使用 AOP 打印请求信息,打印响应信息。
package com.example.aspect; import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import com.example.util.DateUtil;
import org.apache.commons.lang.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream; /**
* @author mingtian
* @desctiption:类功能说明: aop 切面 打印日志
* @data 2019/12/22
* @version:V1
*/
@Aspect
@Component
public class HttpAspect { protected Logger logger = LoggerFactory.getLogger(HttpAspect.class); private Gson gson = new Gson(); /**
* 要处理的方法,包名+类名+方法名
*/
@Pointcut("execution(* com.example.web.controller..*.*(..))")
public void cut() {
} /**
* 前置通知方法
*
* @param joinPoint
*/
@Before("cut()")
public void doBefore(JoinPoint joinPoint) {
//用于获取类方法
logger.info("------------------------ doBefore ----------------------------");
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
StringBuffer requestInfo = new StringBuffer();
requestInfo.append("Address: " + request.getRequestURL().toString() + "\n");
requestInfo.append("IP: " + request.getRemoteAddr() + "\n");
requestInfo.append("MethodName:" + joinPoint.getSignature() + "\n");
Object[] args = joinPoint.getArgs();
//序列化时过滤掉request和response
List<Object> logArgs = streamOf(args).filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)))
.collect(Collectors.toList());
String argStr = JSON.toJSONString(logArgs);
requestInfo.append("RequestParam:" + argStr + "\n");
logger.info(DateUtil.getNowDate() + ",RequestInfo:\n" + requestInfo);
} /**
* 过滤工具类
*
* @param array
* @param <T>
* @return
*/
public static <T> Stream<T> streamOf(T[] array) {
return ArrayUtils.isEmpty(array) ? Stream.empty() : Arrays.asList(array).stream();
} /**
* 后置通知
*/
@After("cut()")
public void doAfter() {
logger.info("-------------------------------doAfter-----------------------");
} /**
* 执行完方法之后返回的参数
*
* @param obj
*/
@AfterReturning(returning = "obj", pointcut = "cut()")
public void doAfterReturning(Object obj) {
// 处理完请求,返回相应参数
logger.info(DateUtil.getNowDate() + ",ResponseResult:" + gson.toJson(obj));
}
}
注意:
DateUtil.getNowDate() 是一个获取当前时间的工具类,如下。
/**
* 格式化日期 格式:yyyy-MM-dd HH:mm:ss SSS
*/
public static String getNowDate() {
String format = "yyyy-MM-dd HH:mm:ss SSS";
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(format));
}
aop 打印请求信息的更多相关文章
- AOP打印请求日志,打印返回值
@Aspect // 申明是个spring管理的bean @Component @Slf4j public class LogAspectServiceApi { private JSONObject ...
- Spring Boot使用AOP在控制台打印请求、响应信息
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等. AOP简介 AOP全称Aspect Oriented Programming,面向切面,AOP主要实现的 ...
- Spring Boot 2.0 教程 | AOP 切面统一打印请求日志
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...
- php curl如何设置自定义请求头和打印请求头信息
$header = [ 'client:h5', 'token:test', ]; curlRequest($url, $params, true, 10, $header); PHP5.1.3版以上 ...
- SpringBoot AOP处理请求日志处理打印
SpringBoot AOP处理请求日志处理打印 @Slf4j @Aspect @Configuration public class RequestAopConfig { @Autowired pr ...
- SpringBoot 配置 AOP 打印日志
在项目开发中,日志系统是必不可少的,用AOP在Web的请求做入参和出参的参数打印,同时对异常进行日志打印,避免重复的手写日志,完整案例见文末源码. 一.Spring AOP AOP(Aspect-Or ...
- python学习(五)--打印错误信息
from urllib import request #打印错误信息 except Exceptionlist = [ "http://www.baidu11.com/", &qu ...
- Spring Boot中使用AOP记录请求日志
这周看别人写的springboot后端代码中有使用AOP记录请求日志,以前没接触过,因此学习下. 一.AOP简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编 ...
- 不要完全相信Chrome控制台打印的信息
以下两张图,第一张是Chrome控制台Network里请求返回的信息,图二是在代码里在请求返回的处理第一行代码用console.log打印的信息. 图一 图二 那么问题来了,为何通过console.l ...
随机推荐
- 一起学Makefile(六)
命令的回显: 通常,make在执行命令之前都会把执行的命令进行输出,例如: 关闭命令回显有以下几种方式: 每个需要关闭回显的命令行之前加上”@”符号: 执行make时机上参数-s 或 –slient进 ...
- centos7 出现“FirewallD is not running”
原因:没有开启防火墙 #提示没有开启防火墙服务,–permanent #永久生效,没有此参数重启后失效 [root@uJZ ~]# firewall-cmd --permanent --zone=/t ...
- HustOJ二次开发之修改数据库连接池
有的时候我们会因为某种业务需要的情况下,需要修改hustoj默认的数据库连接池之类的. 修改数据库连接池步骤 进入到对应的目录 /home/judge/src/web/include 找到db_inf ...
- [原创]浅谈对任务分解法WBS应用
[原创]浅谈对任务分解法WBS应用 1.WBS是什么? 即Work Breakdown Structure如何进行WBS分解:目标→任务→工作→活动 2.WBS分解的原则:将主体目标逐步细化分解,最底 ...
- js - 常用工具集功能函数
Note [普通JSON数组插入指定位置并且合并] let arr = [{ a: 11 }, { a: 11 }, { a: 11 }, { a: 117 }, { a: 11 }, { a: 11 ...
- iOS逆向(五)-ipa包重签名
为什么要重签名? 1.在没有源代码的情况下,你已经对某个应用进行了资源修改(比如修改了启动图或图标等).修改完成以后,如果想要让APP可以正常使用,该APP一定要重新签名然后压缩成IPA文件. 2.如 ...
- (转) centos7 RPM包之rpm命令
原文:https://blog.csdn.net/capecape/article/details/78529159 RPM包与源码包的区别1.软件包分类 源码包:C源代码包 rpm包:编译之后的二进 ...
- (转)ES6系列——let和const深入理解
原文:https://juejin.im/post/59e6a86d518825422c0cbb6f https://www.cnblogs.com/slly/p/9234797.html-----l ...
- 【转】Revit二次开发——读取cad中的文字信息
Revit读取cad的文字信息需要借助Teigha的开源dll,在程序中添加下图中红色框的dll文件的引用,其他的dll文件全部放在同一个文件夹中即可,运行的时候,会自动把这些dll文件全部复制到bi ...
- PHP 动态输出 svgz 格式图片
使用PHP动态生成SVGZ图片(gzip压缩的SVG) 经测试SVG的动画性能很差,简单的动画CPU都能占到 30%左右. 可能的用途: 动态天气图片 访问统计计数图片 文字验证生成 动态头像 静态外 ...