在日常开发过程中,尤其是后台管理系统开发新增、编辑、删除等功能时需要存入操作人信息字段(createBy、updateBy),那么在接口中需要传入编辑人信息,这会使得开发任务变得很繁重,下面就给大家介绍一种运用切面+注解的方式实现快捷用户信息获取方法。
首先我们知道操作数据的接口为了安全性一定需要验签(token或者其他验证方式),而签证内又可以放入用户信息,所以我们可以通过在签证内放入用户信息,然后直接获取签证内的用户数据,所以今天介绍直接获取token内存入的用户信息注入到参数字段
1、定义@SetCode注解,该注解使用在字段上,该注解仅可在controller层使用
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface SetCode {}
2、对使用了@SetCode注解的参数进行赋值操作,这里我们可以用到切面方法对方法内部的字段参数进行修改赋值;有兴趣的可以去看看切面AOP相关内容
注:该切面我是通过自定义@Token注解判断是否需要传入token作为判断依据,直接拦截使用了@Token注解的方法
@Aspect
@Component
public class Aop {
@Resource
private HttpServletRequest request;
@Resource
private JwtUtil jwtUtil; // jwtUntil工具类,主要是解析token,获取token存放的用户信息
/**
* 赋值于userCode信息,用于更新数据库时插入创建人或更新人
* @param pjp
* @return
* @throws Throwable
*/
@Around("@annotation(com.wm.auth.Token)") //切面将要拦截使用了@Token注解的方法(这个可以根据自己的需求使用,可以是注解,可以是方法,也可以是类)
public Object changeValue(ProceedingJoinPoint pjp) throws Throwable {
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
Method method = methodSignature.getMethod();
Parameter[] parameters = method.getParameters();
Object[] args = pjp.getArgs();
for (int i = 0; i < args.length; i++) {
/*找到要修改的参数实体*/
boolean annotationPresent = parameters[i].isAnnotationPresent(SetCid.class);
if (annotationPresent) {
//这儿是获取token内存放的用户信息,根据自己的需要获取就行
int cid = Integer.parseInt(jwtUtil.parseToken(request.getHeader("Authorization")).get("cid").toString().replace("\"",""));
args[i] = cid; //赋值,获取方法的传入的参数,然后赋值给该参数
}
}
return pjp.proceed(args);
}
}
3、使用(因为要搭配@Token注解,所以只能在controller层使用)
@Token //该注解解释了该方法必须要传Token
@GetMapping("/test")
public Result test(@RequestParam(required = false) @SetCode Integer code) {
return Result.success(code);
}