1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
import
java.lang.reflect.Modifier;
import
java.util.HashMap;
import
java.util.Map;
import
javassist.ClassClassPath;
import
javassist.ClassPool;
import
javassist.CtClass;
import
javassist.CtMethod;
import
javassist.bytecode.CodeAttribute;
import
javassist.bytecode.LocalVariableAttribute;
import
javassist.bytecode.MethodInfo;
import
javax.servlet.http.HttpServletRequest;
import
org.aspectj.lang.JoinPoint;
import
org.aspectj.lang.annotation.Aspect;
import
org.aspectj.lang.annotation.Before;
import
org.aspectj.lang.annotation.Pointcut;
import
org.springframework.stereotype.Component;
import
org.springframework.web.context.request.RequestContextHolder;
import
org.springframework.web.context.request.ServletRequestAttributes;
import
com.glodon.bim5d.controller.BaseController;
import
com.glodon.bim5d.util.LoggerMsgUtil;
@Aspect
@Component
public
class
LogAspect {
@Pointcut
(
"execution(public void xxx.xxx.xxx.controller.QRCodeController.download(..))"
)
public
void
pointCut() {
}
@Before
(
"pointCut()"
)
public
void
before(JoinPoint joinPoint)
throws
Exception {
//获得代理类
BaseController controller = (BaseController)joinPoint.getTarget();
//获得request
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
String uri = request.getRequestURI();
String queryString = request.getQueryString();
String projectId = getProjectId(joinPoint);
try
{
HashMap<String, Object> inputParam =
new
HashMap<String, Object>();
inputParam.put(
"uri"
, uri);
inputParam.put(
"projectId"
, projectId);
inputParam.put(
"RequestBody"
, queryString);
LoggerMsgUtil.enterMethodInfo(controller.getLogger(), inputParam);
}
catch
(Exception e) {
LoggerMsgUtil.Info(controller.getLogger(),
"记录入口参数失败:{0}"
, e.getMessage());
}
}
/**
* 从参数列表中获取projectId
*
*/
private
String getProjectId(JoinPoint joinPoint){
String projectId =
null
;
try
{
//获取参数名称和值
Map<String,Object> nameAndArgs = getFieldsNameValueMap(joinPoint);
projectId = nameAndArgs.get(
"projectId"
) ==
null
?
null
: String.valueOf(nameAndArgs.get(
"projectId"
));
}
catch
(Exception e) {
}
return
projectId;
}
private
Map<String,Object> getFieldsNameValueMap(JoinPoint joinPoint)
throws
Exception {
Object[] args = joinPoint.getArgs();
String classType = joinPoint.getTarget().getClass().getName();
Class<?> clazz = Class.forName(classType);
String clazzName = clazz.getName();
String methodName = joinPoint.getSignature().getName();
//获取方法名称
Map<String,Object > map=
new
HashMap<String,Object>();
ClassPool pool = ClassPool.getDefault();
ClassClassPath classPath =
new
ClassClassPath(
this
.getClass());
pool.insertClassPath(classPath);
CtClass cc = pool.get(clazzName);
CtMethod cm = cc.getDeclaredMethod(methodName);
MethodInfo methodInfo = cm.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
if
(attr ==
null
) {
throw
new
RuntimeException();
}
int
pos = Modifier.isStatic(cm.getModifiers()) ?
0
:
1
;
for
(
int
i =
0
; i < cm.getParameterTypes().length; i++){
map.put( attr.variableName(i + pos),args[i]);
//paramNames即参数名
}
return
map;
}
}
|
本文转自 斯然在天边 51CTO博客,原文链接:http://blog.51cto.com/13172906/1964811,如需转载请自行联系原作者