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 ...
随机推荐
- nginx rewrite实战实例
本部分内容为nginx生产环境中使用的场景示例. 域名跳转(域名重定向) 示例1(不带条件的): server{ listen ; server_name www.aminglinux.com; re ...
- pandas批量读取带有日期的文件夹简单操作
工作中碰到了这样一个数据处理的问题,想让你把某个文件夹下的子文件夹中的excel表级联成为1张表,用excel来做会很浪费时间并且很劳累,这时候我们就可以用pandas来加大工作效率,只需要半个小时就 ...
- RFC-6455 The WebSocket Protocol 浅读
什么是WebSokcet? WebSocket是一种协议,并且是各大主流浏览器作为客户端支持的协议.它的目标就是用来替代基于 XMLHTTPRequest和长轮询的解决方案.应用在时时弹幕,消息推送, ...
- git推送本地分支到远程仓库并在远程仓库创建新分支
$ git push <远程主机名> <本地分支名>:<远程分支名> git push master test:test #master 为设置的远程仓库别名,第一 ...
- 【Linux】Linux环境变量的设置和查看
Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1 永久的:需要修改配置文件,变量永久生效. 2 临时的:使用export命令声明即可,变量在关闭shell时失效. 设置变量 ...
- 判断mysql数据库表和表字段是否存在
1.判断数据库表是否存在, // mysqlSELECT table_name FROM information_schema.tables WHERE table_name=#{tableName, ...
- 运维笔记--线上服务器git环境配置
场景描述: 我们采用git去管理代码分支,本地开发环境,线上服务器多数情况下也会使用git去管理程序代码,那么新的一台服务器,如果指定了目标路径作为代码存放路径,该如何配置git环境, 以达到跟远程服 ...
- Python向excel中写入数据的方法 方法简单
最近做了一项工作需要把处理的数据写入到Excel表格中进行保存,所以在此就简单介绍使用Python如何把数据保存到excel表格中. 数据导入之前需要安装 xlwt依赖包,安装的方法就很简单,直接 p ...
- Java12新特性 -- 默认生成类数据共享(CDS)归档文件
默认生成类数据共享(CDS)归档文件 同一个物理机/虚拟机上启动多个JVM时,如果每个虚拟机都单独装载自己需要的所有类,启动成本和内 存占用是比较高的.所以Java团队引入了类数据共享机制 (Clas ...
- PHP Y2K38 (2038年) 问题
PHP 的 strtotime('2100-01-01'); 转换失败:经查询是因为32位系统的 Y2K38问题: Y2K38 问题:当时间大于 2038年01月19日03:14:07 时,strto ...