用注解的方式注解获取登录的用户信息


前言

在开发项目时,往往能通过一个注解就能获取当前登录的用户信息,这次分享一下较多方式中的一种实现的浅析过程


直接上步骤

1.创建一个类对应登录者相关信息

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.Date;


@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private int age;
    private String email;
    @TableField(fill = FieldFill.INSERT)    //插入时填充
    private Date create_time;
    @TableField(fill = FieldFill.INSERT_UPDATE) // 插入或更新时都填充
    private Date update_time;
    @Version
    private int version;
    @TableLogic//逻辑删除注解
    private Integer deleted;
}

2.创建一个自己的注解对接登录的pojo类

创建一个自己的注解,用于相关信息获取

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface User {
}

3.创建一个类实现HandlerMethodArgumentResolver接口

HandlerMethodArgumentResolver接口的作用

HandlerMethodArgumentResolver是一个参数解析器,我们可以通过写一个类实现

HandlerMethodArgumentResolver接口来实现对COntroller层中方法参数的修改,而我们的注解就是放入方法的参数中。
这个接口有两个方法:supportsParameterresolveArgument

1.supportsParameter方法 方法supportsParameter返回值是boolean类型,它的作用是判断Controller层中的参数,是否满足条件,满足条件则执行resolveArgument方法,不满足则跳过。
2.resolveArgument方法 它只有在supportsParameter方法返回true的情况下才会被调用。用于处理一些业务,将返回值赋值给Controller层中的这个参数
3.执行过程 每次请求接口前他会去取Controller层的参数,先执行supportsParameter方法看里面是否包含我们的注解,如果包含返回true,执行resolveArgument方法里面创建登录类,对类进行赋值,再返回。
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

@Component
public class UserMAR  implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        if (parameter.hasParameterAnnotation(User.class)) {
            return true;
        } else if (parameter.getMethodAnnotation(User.class) != null) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        com.example.mybatisplus.pojo.User user = new com.example.mybatisplus.pojo.User();
        user.setName("我是注解测试测试");
        return user;
    }
}

4.创建配置类实现WebMvcConfigurer接口中的addArgumentResolvers方法

该方法可以用在对于Controller中方法参数传入之前对该参数进行处理。然后将处理好的参数在传给Controller中的方法。

@Configuration
public class WebConfig implements WebMvcConfigurer {
     //注入我们注解对接的类
    @Autowired
    UserMAR userMAR;
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(userMAR);
    }
}

5.测试

启动测试项目测试,访问接口,可以看到没有接口没有传入任何参数

@RestController
@RequestMapping("testController")
public class TestController {
    @GetMapping("test1")
    public String inter(@User com.example.mybatisplus.pojo.User user){
        System.out.println(user);
        System.out.println("成功");
        return "成功";
    }
}

在这里插入图片描述
在这里插入图片描述
最后生效,发现对象里面有值

总结

具体的过程就是实现WebMvcConfigurer接口中的addArgumentResolvers方法,他会在每次进入请求接口controller前对参数进行一些处理,实现HandlerMethodArgumentResolver接口中的supportsParameterresolveArgument方法,在resolveArgument做一些我们想要的参数,最后进入方法之前将登录者的信息返回给参数,自然而然里面就可以拿到值了

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值