AOP除了可以通过切入点表达式指定需要切入的方法,还有与注解相关的写法
通过在方法上注自定义注解,注解带不同的权限码;方法被调用前,AOP拦截查看是否有此权限,有则放行
自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Code {
String value() default "";
}
AOP
@Component
@Aspect
public class PermissionHandler {
@Autowired
HttpSession session;
/**
* 权限控制,权限码之前已经存在session中
*/
@Around("@annotation(com.annotation.Code)")
public void permissionHandler(ProceedingJoinPoint joinPoint) throws Throwable {
List<String> permissions = (List<String>) session.getAttribute("permissions");
System.out.println("permissions:"+permissions);
if (permissions == null || permissions.size() == 0) {
// 没有权限时,抛出自定义异常
throw new MyException();
} else {
// 获取方法上的注解对象
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Code code = signature.getMethod().getDeclaredAnnotation(Code.class);
// 如果不存在该授权码,则不执行该方法,并抛出异常
if (!permissions.contains(code.value())) {
throw new MyException();
}
}
joinPoint.proceed();
}
}
需要控制访问的方法
@Code("1001")
@PostMapping("/addRole")
@ResponseBody
public ResultInfo addRole(Role role) {
roleService.addRole(role);
resultInfo.setAll(200, "新增角色成功", null);
return resultInfo;
}