在spring配置

1编写自己的注解类

2.编写注解解析类

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

//注解类

 /**
* 自定义注解 拦截器
* @author
* 给需要监控的方法加上改注解,就可以实现该方法的日志记录
*/
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WbmsService{
//描述
String description() default "";
//操作类型 同步:sync 异步 async
String oprateType() default "";
//客户名称
String clientName() default "";
} 使用方法 在被调用的方法实现类上添加该注解 @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实现拦截接口请求打印日志的更多相关文章

  1. Spring AOP在函数接口调用性能分析及其日志处理方面的应用

    面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...

  2. AOP与Filter拦截请求打印日志实用例子

    相信各位同道在写代码的时候,肯定会写一些日志打印,因为这对往后的运维而言,至关重要的. 那么我们请求一个restfull接口的时候,哪些信息是应该被日志记录的呢? 以下做了一个基本的简单例子,这里只是 ...

  3. 基于Spring AOP实现对外接口的耗时监控

    AOP是Spring的核心,Spring不但自身对多种框架的集成是基于AOP,并且以非常方便的形式暴露给普通使用者.以前用AOP不多,主要是因为它以横截面的方式插入到主流程中,担心导致主流程代码不够清 ...

  4. Spring AOP 的实现方式(以日志管理为例)

    一.AOP的概念 AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充,流行的AOP框架有Sping AOP.Aspect ...

  5. Spring AOP无法拦截内部方法调用

    当在同一个类中,A方法调用B方法时,AOP无法工作的问题 假设一个接口里面有两个方法: package demo.long; public interface CustomerService { pu ...

  6. Spring Aop、拦截器、过滤器的区别

    Filter过滤器:拦截web访问url地址.Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问.Spring AOP拦截器:只能拦截Spring管理Bean的访 ...

  7. spring---aop(3)---Spring AOP的拦截器链

    写在前面 时间断断续续,这次写一点关于spring aop拦截器链的记载.至于如何获取spring的拦截器,前一篇博客已经写的很清楚(spring---aop(2)---Spring AOP的JDK动 ...

  8. 利用Fiddler拦截接口请求并篡改数据

    近期在测试一个下单的项目,出于安全角度考虑,测试了一个场景,那就是利用工具对接口进行拦截并篡改数据.将接口一拦截并篡改数据后,发现收货满满.开发默默接受了我的建议,并对代码进行了修改. 对于fiddl ...

  9. Spring AOP使用注解记录用户操作日志

    最后一个方法:核心的日志记录方法 package com.migu.cm.aspect; import com.alibaba.fastjson.JSON; import com.migu.cm.do ...

随机推荐

  1. Vim技能修炼教程(16) - 浮点数计算函数

    浮点数计算函数 这一节的所有函数,只有在vim编译时支持了+float时才有效. 三角函数 sin() : sine正弦函数 cos() : cosine余弦函数 tan() : tangent正切函 ...

  2. 非在线PDF转图片!!!

    关于非在线 由于这次要转的是身份证,不是阴谋论,防人之心还是要有的.万一呢. 关于工具 试了好多工具,有一家软件竟然是反过来的,即图片转pdf.也给搜了出来,主要的是下载页面还显示的pdf转图片,啊呸 ...

  3. 类的初始化__init__使用

    初始化方法: 作用: 对新创建的对象添加属性 语法: class 类名(继承列表): def __init__(self [, 形参列表]): 语句块 [] 代表中的内容可省略 说明: 1. 实始化方 ...

  4. Android学习问题记录之open failed EACCES (Permission denied)

    1.问题描述 Android调用相机拍照保存,然后读取保存好的照片,在读取照片时出现异常(该异常是因为没有SD卡的读取权限所致): 11-08 11:07:46.421 8539-8539/com.c ...

  5. 监听器(Listener)学习(一)

    一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通 ...

  6. Codeforces 1030E 【暴力构造】

    LINK 题目大意:给你n个数,你可以交换一个数的任意二进制位,问你可以选出多少区间经过操作后异或和是0 思路 充分必要条件: 区间中二进制1的个数是偶数 区间中二进制位最多的一个数的二进制个数小于等 ...

  7. BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】

    BZOJ2095 POI2010 Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛 ...

  8. 《DSP using MATLAB》示例Example7.2

  9. Gridview中实现求和统计功能

    GridView加入自动求和求平均值小计 效果图: 解决方案: private double sum = 0; //取指定列的数据和,你要根据具体情况对待可能你要处理的是int protected v ...

  10. Nchan 安装试用(openresty 同时支持)

    备注:        使用nginx最新的源码包(nginx-1.13.6),以及源码安装   1. 下载源码包(nginx+ Nchan) https://nginx.org/download/ng ...