| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package com.izouma.nineth.aspect;
- import com.anji.captcha.util.StringUtils;
- import com.izouma.nineth.exception.BusinessException;
- import com.izouma.nineth.service.security.RequestCipherService;
- import lombok.extern.slf4j.Slf4j;
- 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.aspectj.lang.reflect.MethodSignature;
- import org.springframework.aop.support.AopUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
- import org.springframework.expression.ExpressionParser;
- import org.springframework.expression.spel.standard.SpelExpressionParser;
- import org.springframework.stereotype.Component;
- import java.lang.annotation.Annotation;
- import java.lang.reflect.Method;
- import java.util.Objects;
- /**
- *
- * 加解密处理
- *
- */
- @Aspect
- @Component
- @Slf4j
- public class RequestCipherInterceptor {
- private static final LocalVariableTableParameterNameDiscoverer DISCOVERER = new LocalVariableTableParameterNameDiscoverer();
- private static final ExpressionParser PARSER = new SpelExpressionParser();
- @Autowired
- private RequestCipherService requestCipherService;
- @Pointcut("@annotation(com.izouma.nineth.aspect.RequestCipher)")
- public void pointcut() {
- }
- @Around("pointcut()")
- public Object doAround(ProceedingJoinPoint point) throws Throwable {
- MethodSignature methodSignature = (MethodSignature) point.getSignature();
- Method targetMethod = AopUtils.getMostSpecificMethod(methodSignature.getMethod(), point.getTarget().getClass());
- String targetName = point.getTarget().getClass().getName();
- String methodName = point.getSignature().getName();
- Object[] arguments = point.getArgs();
- boolean hasProcess = false;
- Annotation[][] annotations = targetMethod.getParameterAnnotations();
- for(int i = 0 ; i < annotations.length; i++){
- Annotation[] itemAry = annotations[i];
- //加密或解密参数
- for(Annotation item : itemAry){
- if(item instanceof CipherParam){
- CipherParam cipherParam = (CipherParam) item;
- Object res = null;
- String cipherData = Objects.toString(arguments[i], "");
- if(StringUtils.isEmpty(cipherData)){
- throw new BusinessException("密文不能为空");
- }
- if(cipherParam.mode()){
- res = requestCipherService.encryptData(cipherData);
- }else{
- res = requestCipherService.decryptData(cipherData);
- }
- //设置处理后的数据
- arguments[i] = res;
- hasProcess = true;
- }
- }
- }
- //如果没有标记处理,默认处理第一个
- if(!hasProcess && arguments.length > 0){
- //默认解密操作
- Object res = requestCipherService.decryptData(Objects.toString(arguments[0], ""));
- arguments[0] = res;
- }
- Object result = point.proceed(arguments);
- return result;
- }
- }
|