侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

切面编程

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 96 阅读 / 1,788 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
权限 例子
@Component
@Aspect
public class powerCheckAspect {
@Pointcut("@annotation(Power)")
public void pointCut() {
}

@Around(value = "pointCut() && @annotation(power)", argNames = "power")
public Object doAround(ProceedingJoinPoint pjp, Power power) throws Throwable {
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
    HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse();
    Employee user = (Employee) request.getSession().getAttribute("user");
    if (user == null) {

// response.sendRedirect("login.html");
return new JsonResult(506, "请先登录");
//todo:login
} else if (user.getPower() == null) {
return new JsonResult(500, "权限设置错误");
} else if ((power.value().getValue() & user.getPower()) >= power.value().getValue() || user.getPower() >= 0b100000) {
return pjp.proceed();
} else
return new JsonResult(504, "缺少权限");
}
}

// 销售退货
@Power(PowerType.xsth)
@PostMapping("/xsth//total")
public JsonResult xiaoShouTuiHuo(@RequestBody List<Cgdetail> detail_list, @PathVariable int order_total) {

System.out.println(detail_list);
return cgdetailService.AddDetailAndOrder(detail_list, order_total, true);

}

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Power {
PowerType value();
}

public enum PowerType {
admin(0b10_0000),
user(0b01_0000),
cg(0b00_1000),
cgth(0b00_0100),
xs(0b00_0010),
xsth(0b00_0001);

private final short value;

PowerType(int value) {
    this.value = (short) value;
}

public short getValue() {
    return value;
}

}







原理
动态代理(优先选择)
cglib代理

就是如何在所有的Service类加上公共方法。


/*
	 * 前置通知 --目标方法之前执行
	 * 后置通知 --目标方法之后执行(如果方法发生异常,不会执行)
	 * 环绕通知--在目标方法之前和之后执行
	 * 异常拦截通知--如果发生异常,就会调用
	 * 后置通知--目标方法之后执行(如果,目标方法发生异常,还会执行)
	 */

0

评论区