1、创建一个自定义注解类
这个类主要用在控制用户接口级操作权限上。所以需要定义permissionName(权限名称)达到可以带参数进入的效果。
package com.kingteam.permission.annotation;
import java.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.core.Ordered;
/**
* 定义权限注解
* @author 秦晓宇
* @date: 2020年10月18日 上午12:22:41
* @record:
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//最高优先级
@Order(Ordered.HIGHEST_PRECEDENCE)
public @interface PermissionAnnotation {
/**
* @Description: 权限名称
* @Title: permissionName
* @return String
* @author qin
* @date 2020年10月18日上午12:16:43
*/
String permissionName() default "";
}
2、创建自定义注解切片操作类,并返回自定义的参数替代原controller参数
做一个简单的判断:如果输入的参数和abc相同,则返回原结果;如果输入的参数和abc不同,则返回没有权限的提醒。
package com.kingteam.permission.annotation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.kingteam.util.common.returnBean.ReturnBean;
/**
* 权限AOP注解切片处理
* @author 秦晓宇
* @date: 2020年10月18日 上午12:00:57
* @record:
*/
@Aspect
@Component
public class PermissionAnnotationAspect {
@Pointcut("@annotation(com.kingteam.permission.annotation.PermissionAnnotation)")
public void point(){
// System.out.println("12");
}
@Before("point()")
public void begin() throws Exception{
// System.out.println("begin");
}
@AfterReturning("point()")
public void after(){
// System.out.println("commit");
}
@Around(value = "@annotation(d)", argNames = "d")
public ReturnBean around(ProceedingJoinPoint joinPoint,PermissionAnnotation d) throws Throwable{
System.out.println("---"+d.permissionName());
System.out.println("around begin");
if(!d.permissionName().equals("abc"))
return ReturnBean.simpleError("您没有这个权限");
else
{
ReturnBean returnBean = (ReturnBean) joinPoint.proceed();
System.out.println("around commit");
return returnBean;
}
}
}
3、测试自定义注解
3.1、测试输入参数和abc不同的情况
package com.kingteam.permission.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.kingteam.permission.annotation.PermissionAnnotation;
import com.kingteam.util.common.returnBean.ReturnBean;
@Controller
@RequestMapping("/permission/")
public class PermissionController {
@PermissionAnnotation(permissionName = "abcd")
@RequestMapping(value="test")
public @ResponseBody ReturnBean test(
){
System.out.println("ReturnBean test");
return ReturnBean.simpleSuccess("123");
}
}
运行结果:输入和参数和abc不同,请求被拦截。同时controller中的操作也不会进行。注意要改变返回数据的话return返回数据位置,要在joinPoint.proceed();之前。
{
"result": false,
"describe": "您没有这个权限",
"data": null
}
3.2、测试输入参数和abc相同的情况
package com.kingteam.permission.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.kingteam.permission.annotation.PermissionAnnotation;
import com.kingteam.util.common.returnBean.ReturnBean;
@Controller
@RequestMapping("/permission/")
public class PermissionController {
@PermissionAnnotation(permissionName = "abc")
@RequestMapping(value="test")
public @ResponseBody ReturnBean test(
){
System.out.println("ReturnBean test");
return ReturnBean.simpleSuccess("123");
}
}
运行结果:controller中的方法被执行,返回执行的数据。
{
"result": true,
"describe": "123",
"data": null
}