package com.idoipo.infras.gateway.open.config;

 import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.idoipo.infras.gateway.open.model.InvokeLogModel;
import com.idoipo.infras.gateway.open.service.IInvokeLogService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; /**
* Create by liping on 2018/8/20
*/
@Aspect
@Configuration//定义一个切面
public class LogRecodeAspect { private static final Logger logger = LoggerFactory.getLogger(LogRecodeAspect.class); @Autowired
IInvokeLogService invokeLogService; // 定义切点Pointcut
@Pointcut("execution(public * com.idoipo.infras.gateway.open.controller..*.*(..))")
public void excudeService() {
} @Around("excudeService()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
String url = request.getRequestURI();
String method = request.getMethod();
String queryString = request.getQueryString();
Object[] args = pjp.getArgs();
String params = "";
String invokeUser = "";
int userFlag = 1;
//获取请求参数集合并进行遍历拼接
if(args.length>0){
if("POST".equals(method)){
Object object = args[0];
Map map = getKeyAndValue(object); params = JSON.toJSONString(map);
}else if("GET".equals(method)){
if(null!=queryString&&""!=queryString){
String[] paramArray = queryString.split("&");
for(String param : paramArray){
String[] keyValue = param.split("=");
String key = keyValue[0];
if(keyValue[0].equals("user")){
invokeUser = keyValue[1];
}else if(keyValue[0].equals("userFlag"))
userFlag = Integer.parseInt(keyValue[1]);
}
params = queryString;
} }
}
logger.info("请求开始地址={},类型={},参数={}:",url,method,params);
Date startTime = new Date();
// result的值就是被拦截方法的返回值
Object result = pjp.proceed();
boolean responseResult = false;
String response = JSONObject.toJSONString(result);
logger.info("请求结束===返回值={}:" + response);
Date endTime = new Date();
InvokeLogModel invokeLogModel = new InvokeLogModel();
invokeLogModel.setInterfaceName(url);
invokeLogModel.setInterfaceMethod(method); invokeLogModel.setInvokeStartTime(startTime);
invokeLogModel.setRequestParam(params); invokeLogModel.setResponseResult(responseResult);
invokeLogModel.setInvokeEndTime(endTime); invokeLogService.insertInvokerLog(invokeLogModel);
return result;
} public static Map<String, Object> getKeyAndValue(Object obj) {
Map<String, Object> map = new HashMap<>();
// 得到类对象
Class userCla = obj.getClass();
/* 得到类中的所有属性集合 */
Field[] fs = userCla.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
Field f = fs[i];
f.setAccessible(true); // 设置些属性是可以访问的
Object val ;
try {
val = f.get(obj);
// 得到此属性的值
map.put(f.getName(), val);// 设置键值
} catch (IllegalArgumentException e) {
logger.error("解析参数异常",e);
} catch (IllegalAccessException e) {
logger.error("解析参数异常",e);
} }
return map;
}
}
package com.idoipo.infras.gateway.open.model;

import java.util.Date;

public class InvokeLogModel {

    //自增id
private int id;
//接口名
private String interfaceName;
//接口方法类型 GET or POST之类的
private String interfaceMethod;
//调用接口开始的时间
private Date invokeStartTime;
//调用接口结束的时间
private Date invokeEndTime;
//接口请求参数
private String requestParam;
//是否有响应值
private Boolean responseResult; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getInterfaceName() {
return interfaceName;
} public void setInterfaceName(String interfaceName) {
this.interfaceName = interfaceName;
} public String getInterfaceMethod() {
return interfaceMethod;
} public void setInterfaceMethod(String interfaceMethod) {
this.interfaceMethod = interfaceMethod;
} public Date getInvokeStartTime() {
return invokeStartTime;
} public void setInvokeStartTime(Date invokeStartTime) {
this.invokeStartTime = invokeStartTime;
} public Date getInvokeEndTime() {
return invokeEndTime;
} public void setInvokeEndTime(Date invokeEndTime) {
this.invokeEndTime = invokeEndTime;
} public String getRequestParam() {
return requestParam;
} public void setRequestParam(String requestParam) {
this.requestParam = requestParam;
} public Boolean getResponseResult() {
return responseResult;
} public void setResponseResult(Boolean responseResult) {
this.responseResult = responseResult;
} @Override
public String toString() {
return "InvokeLogModel{" +
"id=" + id +
", interfaceName='" + interfaceName + '\'' +
", interfaceMethod='" + interfaceMethod + '\'' +
", invokeStartTime=" + invokeStartTime +
", invokeEndTiem=" + invokeEndTime +
", requestParam='" + requestParam + '\'' +
", responseResult=" + responseResult +
'}';
}
}

springcloud 定义切面实现对请求操作记录日志,方便后面分析接口详情的更多相关文章

  1. Spring Boot 2.0 教程 | AOP 切面统一打印请求日志

    欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...

  2. 【原创-算法-实现】异步HTTP请求操作

    一.说明 1) 这个类 是我 在真实项目中,优化解决真实问题 时,不参考第三方代码,完全由自己查阅MSDN官方文档 , 完成的一个真实生产环境中使用的功能类 2) 读者在使用此类时,请尊重原创,在代码 ...

  3. Win8开虚拟wifi ‘无法启动承载网络 组或资源的状态不是执行请求操作的正确状态“

    第一步,首先我们点开开始按钮菜单,要右键以“管理员身份”打开CMD“命令提示符”并键入或者复制(粘贴)命令:netsh wlan show drivers 查看本机无线网卡是否支持此项Wifi热点共享 ...

  4. 【转】python3 urllib.request 网络请求操作

    python3 urllib.request 网络请求操作 基本的网络请求示例 ''' Created on 2014年4月22日 @author: dev.keke@gmail.com ''' im ...

  5. 假定某系统提供硬件的访管指令(例如形式:“svc n”),为了实现系统调用,系统设计者应做哪些工作?用户又如如何请求操作系统服务?

    工作: 1.  编写并调试好能实现各种功能的例行子程序. 2.  编写并调试好访管中断处理程序. 3.  构造例行子程序入口地址表. 在用户程序中,需要请求操作系统服务的地方安排一条系统调用.这样,当 ...

  6. 关于PHP面向对象中—类的定义与对象的实例化操作以及构造、析构函数的特殊用法

    类的定义与对象的实例化操作 <?php //类里面的成员是属于对象的class Hero{    public $name;//成员变量    //成员属性(存在于强类型语言中)    prot ...

  7. Error: 实例 "ddd" 执行所请求操作失败,实例处于错误状态。: 请稍后再试 [错误: Exceeded maximum number of retries. Exhausted all hosts available for retrying build failures for instance 6f60bc06-fcb6-4758-a46f-22120ca35a71.].

    Error: 实例 "ddd" 执行所请求操作失败,实例处于错误状态.: 请稍后再试 [错误: Exceeded maximum number of retries. Exhaus ...

  8. python3 urllib.request 网络请求操作

    python3 urllib.request 网络请求操作 基本的网络请求示例 ''' Created on 2014年4月22日 @author: dev.keke@gmail.com ''' im ...

  9. 【微软100题】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。

    package test; /** * 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef左旋转2位得到字符串cdefab. 请实现字符串左旋转的函数. * ...

随机推荐

  1. python的编解码问题

    http://blog.chinaunix.net/uid-27838438-id-4227131.html

  2. 微信小程序 request域名配置好之后,还是提示报错配置的域名不在request合法域名中

    自己尝试着用nodejs搭个后台服务的时候,用了端口号,然后在小程序中使用的时候,报错说配置的域名不在request合法域名中 明明已经配置好了的啊,看着报错信息.仔细对比了一下两个url请求地址,发 ...

  3. Genymotion的使用 -- A Faster Android Emulator

    Genymotion 安装与配置 1,Genymotion 模拟器 EditText获取焦点时不自动弹出软件盘 选择该模拟器的设置--> 选中Use Virtual keyboard for t ...

  4. [转]理解$watch ,$apply 和 $digest --- 理解数据绑定过程

    原文地址:http://angular-tips.com/blog/2013/08/watch-how-the-apply-runs-a-digest/ 注 这篇博文主要是写给新手的,是给那些刚刚开始 ...

  5. Python 列表的切片和连接

    一.定义一个list >>> a = [1, 3, 4, 5, 'a', 's'] >>> a [1, 3, 4, 5, 'a', 's'] 二.获取列表中前3个元 ...

  6. [转]java 中的序列化是什么意思?有什么好处?

    1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比 ...

  7. 蓝桥杯 算法训练 ALGO-141 P1102

    算法训练 P1102   时间限制:1.0s   内存限制:256.0MB 定义一个学生结构体类型student,包括4个字段,姓名.性别.年龄和成绩.然后在主函数中定义一个结构体数组(长度不超过10 ...

  8. AngularJS:参考手册

    ylbtech-AngularJS:参考手册 1.返回顶部 1. AngularJS 参考手册 AngularJS 指令 本教程用到的 AngularJS 指令 : 指令 描述 ng-app 定义应用 ...

  9. java restful response 万能类

    import java.util.HashMap; import java.util.Map; public class ResponseData { private final String mes ...

  10. rails 自定义校验及validates_each多校验

    一.自定义校验 使用 validate 方法传入一个同名方法的 Symbol 即可. validate :my_validation private def my_validation if name ...