ResponseAop.java 2.11 KB
package com.pipihelper.project.interceptor;

import com.pipihelper.project.core.Result;
import com.pipihelper.project.core.ResultCode;
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.springframework.stereotype.Component;

/**
 * 白名单拦截器,用于控制允许访问的请求
 *
 * @author zlikun
 * @date 2021/10/21 14:39
 */
@Slf4j
@Component
@Aspect
public class ResponseAop {
    //这里改成自己项目的控制层路径
    @Pointcut("execution(public * com.pipihelper.project.controller..*(..))")
    public void httpResponse() {
    }
    //环切
    @Around("httpResponse()")
    public Result handlerController(ProceedingJoinPoint proceedingJoinPoint) {
        Result result = new Result();
        try {
            //获取方法的执行结果
            Object proceed = proceedingJoinPoint.proceed();
            //如果方法的执行结果是Result,则将该对象直接返回
            if (proceed instanceof Result) {
                result = (Result) proceed;
            } else {
                //否则,就要封装到Result的data中
                result.setData(proceed);
            }
        }  catch (Throwable throwable) {
            //如果出现了异常,调用异常处理方法将错误信息封装到Result中并返回
            result = handlerException(throwable);
        }
        return result;
    }

    //异常处理
    private Result handlerException(Throwable throwable) {
        Result result = new Result();
        //这里需要注意,返回枚举类中的枚举在写的时候应该和异常的名称相对应,以便动态的获取异常代码和异常信息,我这边是统一返回500,msg存报的异常
        //获取异常名称的方法
        String errorName = throwable.toString();
        errorName = errorName.substring(errorName.lastIndexOf(".") + 1);
        result.setMessage(errorName);
        result.setCode(ResultCode.INTERNAL_SERVER_ERROR);
        return result;
    }

}