zoukankan      html  css  js  c++  java
  • 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);
    }
    
    

    参考资料:

  • 相关阅读:
    Python3爬虫系列:理论+实验+爬取妹子图实战
    虚机安装后无网卡、网卡驱动
    Linux运维工程师面试题整理
    睡眠或者重启windows,无法ssh连接或者pingVMware的虚机
    W10: Warning: Changing a readonly file使用vi/vim报错问题解决
    keyboard-interactive authentication with the ssh2 server failed 的SecureCRT报错解决
    公网访问内网实现(内网穿透)
    Linux内网时钟同步问题(ntp和chrony)
    xshell的快捷复制粘贴设置
    Linux中shell去除空行的几种方法
  • 原文地址:https://www.cnblogs.com/Zzwena/p/13261297.html
Copyright © 2011-2022 走看看