aop解析token并对Controller参数进行赋值
-
问题:
使用token进行身份鉴权,用户每次请求都会携带token进行访问,token中存入用户id的信息,在接下来的请求中不想再传入userId,想通过解析token获得id。 -
解决方法:
使用aop的方法,在请求进入controller之前,解析token,将获取到的id直接赋值到参数中。
package com.example.diskdemo.exception;
import com.example.diskdemo.pojo.vo.FileVo;
import com.example.diskdemo.pojo.vo.UserVo;
import com.example.diskdemo.util.JwtUtil;
import io.jsonwebtoken.Claims;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* userId切面类
* 对于所有的Controller传入的参数通过解析用户token获取userId,赋值到Vo中
* 前端免去了传入userId的麻烦
*
* @author Zzwen
* @date 2020/7/7 14:05
*/
@Aspect
@Component
public class UserIdAdvice {
/**
* 切入点,定义所有的控制器
*/
@Pointcut("execution(public * com.example.diskdemo.controller.*.*(..)))")
public void pointCut() {
}
@Before("pointCut()")
public void before(JoinPoint joinPoint) {
//获取上下文request,获取token并解析
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
String token = request.getHeader("X-Token");
if(token == null){
return;
}
//获取参数并赋值
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
Claims claims = JwtUtil.parseJwt(token);
Object userId = claims.get("id");
//对于不同的Vo类进行相应的赋值
if (arg instanceof FileVo) {
FileVo fileVo = (FileVo) arg;
fileVo.setUserId(String.valueOf(userId));
}
if (arg instanceof UserVo) {
UserVo userVo = (UserVo) arg;
userVo.setId(String.valueOf(userId));
}
}
}
}
本例中的controller
@PostMapping("/doQuery")
public CommonResponse doQuery(@RequestBody UserVo userVo) {
UserDto userDto = dozerMapper.map(userVo, UserDto.class);
return fileService.doQuery(userDto);
}
@PostMapping("/newFolder")
public CommonResponse newFolder(FileVo fileVo) {
FileDto fileDto = dozerMapper.map(fileVo, FileDto.class);
return fileService.newFolder(fileDto);
}
参考资料:
- 1、AOP之获取Controller请求(Request)、返回(Response)参数、报错信息实现日志记录
- 2、Spring AOP SpringBoot集成
010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101