提交 519c55e4 authored 作者: 杨凯's avatar 杨凯

feat:家庭医生初始化

上级 fd87165b
package com.ebaiyihui.family.doctor.server.aspect; package com.ebaiyihui.family.doctor.server.aspect;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.HashMap; import java.util.Arrays;
import java.util.Map;
/** /**
* @program chenmt-rides * @program chenmt-rides
...@@ -34,87 +30,46 @@ import java.util.Map; ...@@ -34,87 +30,46 @@ import java.util.Map;
public class LogAspect { public class LogAspect {
//xyz.chenmt.www.chenmtrides.controller包下的所有类中的所有方法,".."表示所有方法中的参数不限个数; //xyz.chenmt.www.chenmtrides.controller包下的所有类中的所有方法,".."表示所有方法中的参数不限个数;
//切入点,其中execution用于使用切面的连接点。使用方法:execution(方法修饰符(可选) //切入点,其中execution用于使用切面的连接点。使用方法:execution(方法修饰符(可选)
// 返回类型 方法名 参数 异常模式(可选)) ,可以使用通配符匹配字符,*可以匹配任意字符。 // 返回类型 方法名 参数 异常模式(可选)) ,可以使用通配符匹配字符,*可以匹配任意字符。
@Pointcut("execution(public * com.ebaiyihui.family.doctor.server.controller.*.*(..))") @Pointcut("execution(public * com.ebaiyihui.family.doctor.server.controller.*.*(..))")
public void LogAspect(){} public void LogAspect() {
}
//环绕通知,就是可以在执行前后都使用,这个方法参数必须为ProceedingJoinPoint,proceed()方法就是被切面的方法,
// 上面四个方法可以使用JoinPoint,JoinPoint包含了类名,被切面的方法名,参数等信息。 Long time = 0L;
@Around("LogAspect()")
public Object deAround(ProceedingJoinPoint pjp) throws Throwable{ @Before("LogAspect()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes(); time = System.currentTimeMillis();
ServletRequestAttributes sra = (ServletRequestAttributes) ra; /**
HttpServletRequest request = sra.getRequest(); * 接收到请求,记录请求内容
*/
//ip地址 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String ipaddress; HttpServletRequest request = attributes.getRequest();
if (request.getHeader("x-forwarded-for") == null) {
ipaddress = request.getRemoteAddr(); Method targetMethod = ((MethodSignature) joinPoint.getSignature()).getMethod();
} else {
ipaddress = request.getHeader("x-forwarded-for"); Method realMethod = joinPoint.getTarget().getClass().getDeclaredMethod(joinPoint.getSignature().getName(), targetMethod.getParameterTypes());
}
ApiOperation operation = realMethod.getAnnotation(ApiOperation.class);
String url = request.getRequestURL().toString();
String method = request.getMethod(); /**
String queryString = request.getQueryString(); * 记录下请求内容
Object[] args = pjp.getArgs(); */
String params = "";
//获取请求参数集合并进行遍历拼接 log.info("请求开始===方法描述:{},\n请求方法:{},\n请求地址:{},\n请求ip:{},\n请求类型:{},\n请求参数:{}", operation.value(), joinPoint.getSignature().getName(), request.getRequestURL().toString(),
if(args.length>0){ request.getRemoteAddr(), request.getMethod(), JSON.toJSONString(Arrays.toString(joinPoint.getArgs())));
if("POST".equals(method)){
Object object = args[0];
Map map = getKeyAndValue(object);
params = JSON.toJSONString(map);
;
}else if("GET".equals(method)){
params = queryString;
}
}
Signature signature = pjp.getSignature();
MethodSignature methodSignature = (MethodSignature)signature;
Method targetMethod = methodSignature.getMethod();
Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(signature.getName(), targetMethod.getParameterTypes());
ApiOperation operation=realMethod.getAnnotation(ApiOperation.class);
if(null!=operation){
log.info("请求开始===方法描述:{},请求方法:{},请求地址:{},请求ip:{},请求类型:{},请求参数:{}",operation.value(),realMethod.getName(),url,ipaddress,method,params);
}else{
log.info("请求开始===请求方法:{},请求地址:{},请求ip:{},请求类型:{},请求参数:{}",realMethod.getName(),url,ipaddress,method,params);
}
// result的值就是被拦截方法的返回值
// Object result = pjp.proceed();
// log.info("请求结束===返回值{}", JSONObject.toJSON(result));
return pjp.proceed();
} }
@AfterReturning(returning = "ret", pointcut = "LogAspect()")
public void doAfterReturning(Object ret) throws Throwable {
public static Map<String, Object> getKeyAndValue(Object obj) { /**
Map<String, Object> map = new HashMap<String, Object>(); * 处理完请求,返回内容
// 得到类对象 */
Class userCla = (Class) obj.getClass(); log.info("请求结束===返回值==>{}", JSON.toJSONString(ret));
/* 得到类中的所有属性集合 */ log.info("=======请求接口所需时间====>{}", JSON.toJSONString((System.currentTimeMillis() - time)));
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) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return map;
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论