利用注解获取登录的用户信息
- 前言
- 直接上步骤
- 1.创建一个类对应登录者相关信息
- 2.创建一个自己的注解对接登录的pojo类
- 3.创建一个类实现HandlerMethodArgumentResolver接口
- HandlerMethodArgumentResolver接口的作用
- 1.supportsParameter方法 方法supportsParameter返回值是boolean类型,它的作用是判断Controller层中的参数,是否满足条件,满足条件则执行resolveArgument方法,不满足则跳过。
- 2.resolveArgument方法 它只有在supportsParameter方法返回true的情况下才会被调用。用于处理一些业务,将返回值赋值给Controller层中的这个参数
- 3.执行过程 每次请求接口前他会去取Controller层的参数,先执行supportsParameter方法看里面是否包含我们的注解,如果包含返回true,执行resolveArgument方法里面创建登录类,对类进行赋值,再返回。
- 4.创建配置类实现WebMvcConfigurer接口中的addArgumentResolvers方法
- 5.测试
- 总结
前言
在开发项目时,往往能通过一个注解就能获取当前登录的用户信息,这次分享一下较多方式中的一种实现的浅析过程
直接上步骤
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层中方法参数的修改,而我们的注解就是放入方法的参数中。
这个接口有两个方法:supportsParameter和resolveArgument1.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接口中的supportsParameter和resolveArgument方法,在resolveArgument做一些我们想要的参数,最后进入方法之前将登录者的信息返回给参数,自然而然里面就可以拿到值了