AntiXSSAspect.java 2.87 KB
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;
    }
}