Java 通过自定义注解实现AOP面向切面编程

自定义注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
public @interface TestOverdue {
    String value() default "";
}

controller:

/**
     * 登录
     */
    @ApiOperation(value = "登录", notes = "登录")
    @PostMapping("/sys/login")
    @TestOverdue
    public CommonResult login(@RequestBody SysLoginForm form) {
    	Map<String, Object> params = new HashMap<>();
    	......
        params.put("token", token);
        params.put("expire", expire);
        params.put("username", loginUser.getName());
        params.put("id",loginUser.getId());
        params.put("departmentId",loginUser.getDepartmentId());
        params.put("days",form.getDays());
        return CommonResult.ok().data(params);
   }

切面类:

import com.his.common.result.CommonResult;
import com.his.system.shiro.form.SysLoginForm;
import com.his.uc.facade.ISettingFacade;
import org.apache.dubbo.config.annotation.Reference;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

@Component
@Aspect
public class APIProxy {

    @Reference
    private ISettingFacade iSettingFacade;

    //定义切点
    @Pointcut("@annotation(com.his.system.aspect.TestOverdue)")
    public void doAspect() {
    }

    // 环绕通知
    @Around("doAspect()")
    public Object around(ProceedingJoinPoint  joinPoint) throws Throwable {
        Map setting = iSettingFacade.getById();
        String expireTime = setting.get("expireTime").toString();

        SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        /*天数差*/
        Date fromDate1 = simpleFormat.parse(expireTime);
        Date toDate1 = new Date();
        long from1 = fromDate1.getTime();
        long to1 = toDate1.getTime();
        int days = (int) ((from1 - to1) / (1000 * 60 * 60 * 24));
        System.out.println("两个时间之间的天数差为:" + days);
        Object proceed;
        if(days <= 0){
        	//①-直接返回失败的内容
            proceed = CommonResult.loginError().msg("已过期,不可使用!");
        }else if(days <= 30 && days > 0){
        	//②-弹框提示到期时间后可继续登陆成功
        	//获取目标参数
            Object[] args1 = joinPoint.getArgs();
            //强转为需要的对象
            SysLoginForm sysLoginForm = (SysLoginForm)args1[0];
            //将当前计算天数需返回到login接口返回成功的map中
            sysLoginForm.setDays(days);
            args1[0] = sysLoginForm;
            proceed = joinPoint.proceed(args1);
        }else {
        	//③-继续执行目标方法
            proceed = joinPoint.proceed();
        }
        return proceed;
    }

}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值