spring aop实现拦截接口请求打印日志

摘要:
在Spring配置1中,编写自己的注释类。2.编写注释解析类。3.配置springaop代理(我可以使用注释来配置切入点。有两种代理类型。默认的jdk代理设置为true作为cglib代理)//注释类1/**2*自定义注释拦截器3*@author4*将修改的注释添加到要监视的方法中,然后可以记录该方法。5*/ 6@Target({ElementType.PARAMETER,ElementType.METHOD}

 在spring配置 

1编写自己的注解类

2.编写注解解析类

3.配置spring aop代理 (下面我使用注解 如使用配置 配置切点即可,有两种代理默认jdk代理 设置true 为cglib代理)

//注解类

 1 /**
 2 * 自定义注解 拦截器 
 3 * @author 
 4 * 给需要监控的方法加上改注解,就可以实现该方法的日志记录
 5 */
 6 @Target({ ElementType.PARAMETER, ElementType.METHOD })
 7 @Retention(RetentionPolicy.RUNTIME)
 8 @Documented
 9 public @interface WbmsService{
10 //描述
11 String description() default "";
12 //操作类型 同步:sync 异步 async
13 String oprateType() default "";
14 //客户名称
15 String clientName() default "";
16 }
17 
18 使用方法 在被调用的方法实现类上添加该注解
19 
20 @WbmsService(description = "客户欠款查询", oprateType = "sync", clientName = "")
@Aspect
@Component
public class InterfaceRecord {

// logService
private IBizLogRecordService bizLogRecordService;

// 初始化日志类
private static final Log logger = LogFactory.getLog(InterfaceRecord.class);

// Service层切点
@Pointcut("@annotation(com.deppon.dpap.module.common.server.aop.WbmsService)")
public void serviceAspect() {
}

@Before(value = "serviceAspect()")
public void doBefore(JoinPoint joinPoint) {
String now = DateUtil.getToday();
logger.info("接口拦截开始时间:" + now);
}

@AfterReturning(value = "serviceAspect()", argNames = "retVal", returning = "retVal")
public void doAfterReturning(JoinPoint joinPoint, Object retVal) {
String now = DateUtil.getToday();
logger.info("接口拦截结束时间:" + now);
WbmsLogEntity log = new WbmsLogEntity();
try {
// 补充数据
log = supplementEntity(log, joinPoint);
// 返回参数
String responseStr = "";
if (retVal != null) {
responseStr = JSON.toJSONString(retVal);
}
// 响应内容
log.setResponsContent(responseStr);
// 成功状态
log.setIsSuccess(Constant.YES);
// 保存到数据库
bizLogRecordService.saveWbmsLog(log);
} catch (Exception e) {
logger.error("==异常通知异常==");
logger.error("异常信息:{}", e);
}
}

/**
* @Title: doAfterThrowing
* @Description: TODO 异常统一处理
* @param tags
* @return return_type
* @throws
*/
@AfterThrowing(pointcut = "serviceAspect()", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, Throwable e) {
String now = DateUtil.getToday();
logger.error("接口异常拦截时间:" + now);
logger.error("接口异常信息:" + e);
WbmsLogEntity log = new WbmsLogEntity();
try {
// 补充数据
log = supplementEntity(log, joinPoint);
// 异常状态
log.setIsSuccess(Constant.NO);
String responseStr = "";
if (e != null) {
responseStr = JSON.toJSONString(e);
}
// 响应信息
log.setResponsContent(responseStr);
// 保存到数据库
bizLogRecordService.saveWbmsLog(log);
} catch (Exception ee) {
logger.error("==异常通知异常==");
logger.error("异常信息:{}", ee);
}
}

/**
* @Title: supplementEntity
* @Description: TODO 填充数据
* @param tags
* @return return_type
* @throws
*/
private WbmsLogEntity supplementEntity(WbmsLogEntity log,
JoinPoint joinPoint) {
try {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest();
// 请求的IP
String ip = request.getRemoteAddr();
// 客户端IP
log.setClientIp(ip);
} catch (Exception ee) {
// TODO: handle exception
logger.error("获取不到httprequest:" + ee);
}
// 注解
Map<String, String> annos = getServiceMthodAnnotatin(joinPoint);
// 客户名称
log.setClientName(annos.get("clientName"));
// 创建时间
log.setCreateTime(new Date());
// 操作功能
String requestMethod = joinPoint.getTarget().getClass().getName() + "."
+ joinPoint.getSignature().getName() + "()";
logger.info("请求方法:" + requestMethod);
log.setOprateMethod(requestMethod);
// 操作时间
log.setOprateTime(new Date());
// 操作类型
log.setOprateType(annos.get("oprateType"));
// 操作描述
log.setOprateDes(annos.get("description"));
// 请求参数
StringBuffer requestStr = new StringBuffer();
JSONArray jay = new JSONArray();
// 获取请求参数
if (joinPoint.getArgs() != null && joinPoint.getArgs().length > 0) {
for (int i = 0; i < joinPoint.getArgs().length; i++) {
if (i != joinPoint.getArgs().length - 1) {
requestStr.append(JSON.toJSONString(joinPoint.getArgs()[i]));
requestStr.append(",");
} else {
requestStr.append(JSON.toJSONString(joinPoint.getArgs()[i]));
}
}
}
String arrayStr = "[" + requestStr + "]";
jay = JSON.parseArray(arrayStr);
// 操作单据
// 操作人
List<String> createUserCodes = new ArrayList<String>();
// 操作人数据
createUserCodes.add("customerCode");
createUserCodes.add("createCode");
createUserCodes.add("operatePersoncode");
createUserCodes.add("disablePercode");
String createUserCode = JsonUtil.analysisJson(jay, createUserCodes);
// 创建人
log.setCreateUserCode(createUserCode);
// 修改人
log.setModifyUserCode(createUserCode);
// 操作人
log.setOpratePer(createUserCode);
// 请求参数
log.setRequestContent(requestStr.toString());
// 修改时间
log.setUpdateTime(new Date());
return log;
}


public void setBizLogRecordService(IBizLogRecordService bizLogRecordService) {
this.bizLogRecordService = bizLogRecordService;
}

/**
* 获取注解中对方法的描述信息 用于service层注解
* 
* @param joinPoint
* 切点
* @return 方法描述
* @throws Exception
*/
@SuppressWarnings("rawtypes")
public static Map<String, String> getServiceMthodAnnotatin(
JoinPoint joinPoint) {
// 结果
Map<String, String> result = new HashMap<String, String>();
// 获取target class名称
String targetName = joinPoint.getTarget().getClass().getName();
// 获取target method名称
String methodName = joinPoint.getSignature().getName();
// 获取请求参数
Object[] arguments = joinPoint.getArgs();
// 注解类
try {
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
// 注解方法
String description = "";
String oprateType = "";
String clientName = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description = method.getAnnotation(WbmsService.class)
.description();
oprateType = method.getAnnotation(WbmsService.class)
.oprateType();
clientName = method.getAnnotation(WbmsService.class)
.clientName();
// 接口描述
result.put("description", description);
// 操作类型
result.put("oprateType", oprateType);
// 客户名称
result.put("clientName", clientName);
break;
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return result;
}
}
<!-- aop激活自动代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>

免责声明:文章转载自《spring aop实现拦截接口请求打印日志》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇富数据控件 GridView(模版)Windows7下使用sphinx生成开源文档(原)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用C++ 实现的 websocket 客户端 (基于easywsclient)

直接上代码 easywsclient.hpp #ifndef EASYWSCLIENT_HPP_20120819_MIOFVASDTNUASZDQPLFD #define EASYWSCLIENT_HPP_20120819_MIOFVASDTNUASZDQPLFD // This code comes from: // https://github.co...

logging获取日志

获取日志并保存有两种写法,分别如下 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019-07-03 16:36 # @File : logging_test.py ''' logging获取日志 longging模块包括logger,Handler,Filter,Formatter lo...

避免Double数据显示为科学记数

显示现象 数据类型 实体类中为 private Double tradeAmount; Oracle数据库中为 NUMBER(19,4) 解决方式 第一种解决方式 -无效 将Double转为String,(String.valueOf(double)方法, 也可以用最笨的方法,就是直接+;如:String str = ""+double;) 第二种解决方...

springboot+aop切点记录请求和响应信息

本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息;这里主要讲解两种切入点方式,一种方法切入,一种注解切入;首先创建个springboot测试工程并通过maven添加如下依赖: <!-- AOP --> <dependency> <gr...

ListView数据动态更新

      经常会用到数据与前台控件绑定相关的问题,一直知道要用委托(代理)但每次都忘,而且每次都百度了一遍又一遍,就是不长记性,这次一定好好记下来下次就不会忘了。       后台数据与前台绑定主要分为两步:       第一步把要绑定的数据定义为一个数据集合或对象绑定到List中,方便调用: public class TestCase:INotifyP...

nginx日志统计分析-shell

nginx日志分析常用命令,包括IP相关统计、页面访问统计、性能分析、蜘蛛抓取统计、TCP连接统计等相关命令的总结 1. IP相关统计 1.1 ip访问量统计 awk '{print $1}' access.log | sort -n | uniq | wc -l 1.2 查看某一时间段的IP访问量(5-6点) grep "07/Jan/2019:0[5-...