这样的如何实现?自动注入当前登录的用户id、当前登录的用户对象
@RequestMapping("/test1")
public String test1(@UserId Long userId, @LoginedUser User user) {
return String.format("test1,userId=%s , User对象: %s", userId, user);
}
第一步-解析用户请求Header里的token
通过token进一步拿到用户的相关信息,并将信息设置到request的attributes
由于解析过程大家各自实现不同,这里不贴完整代码了,设置上去的key你自己定
//解析token进一步拿到用户信息,假设是user
//设置到request attribute里
request.setAttribute(IUserAuthUtil.LOGINED_USER, user);
第二步-定义自己的注解(按需来,也可以不定义)
**
* 注入登录的用户ID
*
* @author : humorchen
* @date 2022/1/1
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface UserId {
}
**
* 注入登录的用户对象
*
* @author : humorchen
* @date 2022/1/1
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface LoginedUser {
}
第三步-自定义接口方法参数注入
/**
* 参数注入@UserId
*
* @author :humorchen
* @date 2022/1/2 16:48
*/
@Component
@Slf4j
public class UserIdArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
Parameter reflectParameter = parameter.getParameter();
return reflectParameter.isAnnotationPresent(UserId.class) && reflectParameter.getType().equals(Long.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
User user = (User) webRequest.getAttribute(IUserAuthUtil.LOGINED_USER, NativeWebRequest.SCOPE_REQUEST);
//从request拿到的
if (user != null) {
return user.getId();
}
return null;
}
}
/**
* 注解注入已登录用户@LoginedUser
*
* @author :humorchen
* @date 2022/1/2 17:05
*/
@Component
public class LoginedUserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
Parameter reflectParameter = parameter.getParameter();
return reflectParameter.isAnnotationPresent(LoginedUser.class) && reflectParameter.getType().equals(User.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
return webRequest.getAttribute(IUserAuthUtil.LOGINED_USER, NativeWebRequest.SCOPE_REQUEST);
}
}
第四步-注册上去
/**
* spring mvc web 配置
*
* @author :humorchen
* @date 2022/1/1 22:14
*/
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Autowired
private UserIdArgumentResolver userIdArgumentResolver;
@Autowired
private LoginedUserArgumentResolver loginedUserArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
//@UserId注入
resolvers.add(userIdArgumentResolver);
//@LoginedUser注入
resolvers.add(loginedUserArgumentResolver);
}
}
测试结果
能够正常拿到
这里的User是我手动构建的登录态,很多参数是空的不用管