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 ...
随机推荐
- MYSQL避免重复插入记录的三种方法
方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: insert ignore into table_name(ema ...
- mariadb新安装解决远程访问以及root登录
mariadb新安装解决远程访问以及root登录一.修改/etc/mysql/my.conf找到bind-address = 127.0.0.1这一行直接#掉或者改为bind-address = 0. ...
- ArrayMap和HashMap区别
什么是Map? Map的三个特点 1.包含键值对 2.键唯一 3.键对应的值唯一 一:hash 什么是Hash Hash,也可以称为“散列”,就是把任意长度的输入,通过散列算法,变换成固定长度的输出, ...
- Java编程思想之五初始化与清理
随着计算机革命的发展,"不安全"的编程方式已经逐渐称为编程代价高昂的主因之一. 初始化和清理正是涉及安全的两个问题. 5.1 用构造器确保初始化 通过提供构造器,类的设计者可确保每 ...
- 范仁义html+css课程---10、其它标签
范仁义html+css课程---10.其它标签 一.总结 一句话总结: 了解iframe.Figure与Figcaption.address.progress.meter.datalist.field ...
- Mysql之Incorrect string value: '\xF0\x9F\x98\x89 \xE6... 保存emoji表情
错误信息如下: Incorrect string value: '\xF0\x9F\x98\x89 \xE6...' 问题产生的原因是字符串不兼容4字节的unicode导致的,一般我们常见的表情编码等 ...
- fdisk、mkfs.ext4、make_ext4fs、img2simg、simg2img
一个典型的嵌入式系统是由uboot+kernel+rootfs组成的,其中uboot和kernel都是二进制,rootfs存在文件系统. 二进制在烧录的时候比较简单,将二进制数据写入存储设备固定地址: ...
- mysql知识集锦
1.mysql中InnoDB引擎中页的概念 2.mysql索引详解--如何从磁盘中读取索引文件
- Proj.4 升级新版本5.x和6.x
目录 Proj.4 升级新版本5.x和6.x 0.缘起 1.5.x和6.x更新情况简述 PROJ 5.x 更新 PROJ 6.x 更新 2.从PROJ.4向新版本迁移 迁移到5.x版本 迁移到6.x版 ...
- Centos7.5安装OpenJDK1.8
安装openJDK 1.8yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 获取java home dirname $(readli ...