天天看點

aop解析token并對Controller參數進行指派

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