AntiXSSAspect.java
2.87 KB
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package com.xkl.security;
import lombok.extern.apachecommons.CommonsLog;
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.springframework.stereotype.Service;
import java.lang.reflect.Field;
/**
* 对String或者Entity中的String进行AntiXSS处理
* <p/>
* Created by win7 on 2016/10/21.
*/
@Service
@Aspect
@CommonsLog
public class AntiXSSAspect {
/**
* 定义切点,定位到@AntiXSS注解的地方
*/
@Pointcut("@annotation(com.xkl.security.AntiXSS)")
public void antiXSSPointCut() {
}
/**
* 对String类型活包含String类型的POJO进行antiXSS处理
*
* @param point
*/
@Around("antiXSSPointCut()")
public Object doAround(ProceedingJoinPoint point) {
Object result = null;
Object args[] = point.getArgs();
try {
antiXSS(args);
result = point.proceed(args);
} catch (Throwable throwable) {
log.error(point.getSignature().getName() + " failed");
}
return result;
}
/**
* antiXSS处理
*
* @param args
*/
private void antiXSS(Object[] args) {
if (args == null) {
return;
}
for (int i = 0; i < args.length; i++) {
if (args[i] == null) {
continue;
}
if (args[i] instanceof String) {//String类型
args[i] = AntiXSSUtil.antiXSS((String) args[i]);
}
if (!isPrimitive(args[i])) {//非基本类型
antiXSSEntity(args[i]);
}
}
}
/**
* 对Entity进行antiXSS
*
* @param object
* @return 处理后的结果
*/
private void antiXSSEntity(Object object) {
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
Object arg = field.get(object);
if (arg instanceof String) {
arg = AntiXSSUtil.antiXSS((String) arg);
field.set(object, arg);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
/**
* 判断是否是基本类型
*
* @param arg
* @return
*/
private boolean isPrimitive(Object arg) {
try {
/************ 基本类型中包含Class<T> TYPE字段 **********/
Field field = arg.getClass().getDeclaredField("TYPE");
field.setAccessible(true);
Class fieldClass = (Class) field.get(arg);
if (fieldClass.isPrimitive()) {
return true;
}
} catch (Exception e) {
return false;
}
return true;
}
}