7

SpringMVC使用自定义参数解析器获取当前用户

 2 years ago
source link: https://maxqiu.com/article/detail/123
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
SpringMVC使用自定义参数解析器获取当前用户
SpringMVC使用自定义参数解析器获取当前用户

2021/11/07  Java  SpringMVC

参考链接:HandlerMethodArgumentResolver(四):自定参数解析器处理特定场景需求,介绍PropertyNamingStrategy的使用【享学Spring MVC】

日常在写后端接口时,经常会写如下代码,用于获取当前用户

  1. @Autowired
  2. private UserService userService;
  3. @GetMapping("xxx")
  4. public String test(@RequestHeader("Authorization") String token){
  5. // 根据token获取当前用户
  6. User user = userService.getUserByToken(token);
  7. return "xxx";
  8. }

实际上,SpringMVC提供了HandlerMethodArgumentResolver接口,用于添加自定义参数解析器,方便在方法的参数中获取当前用户

  1. /**
  2. * 自定义接口,用户标记当前方法的参数
  3. */
  4. @Documented
  5. @Target({ElementType.PARAMETER})
  6. @Retention(RetentionPolicy.RUNTIME)
  7. public @interface CurrUser {}
  1. /**
  2. * 用户信息实体
  3. */
  4. @Getter
  5. @Setter
  6. public class CurrUserVo {
  7. private Long id;
  8. private String name;
  9. }

自定义解析器

  1. /**
  2. * 自定义解析器,用于处理类型是CurrUserVo的参数
  3. */
  4. public class CurrUserArgumentResolver implements HandlerMethodArgumentResolver {
  5. @Override
  6. public boolean supportsParameter(MethodParameter parameter) {
  7. // 只有标注有CurrUser注解,并且数据类型是CurrUserVo的才给与处理
  8. CurrUser ann = parameter.getParameterAnnotation(CurrUser.class);
  9. Class<?> parameterType = parameter.getParameterType();
  10. return ann != null && CurrUserVo.class.isAssignableFrom(parameterType);
  11. }
  12. @Override
  13. public CurrUserVo resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
  14. NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
  15. HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
  16. // 从请求头中拿到token
  17. String token = request.getHeader("Authorization");
  18. if (ObjectUtils.isEmpty(token)) {
  19. // 此处不做异常处理,校验token因放在拦截器中处理
  20. return null;
  21. }
  22. // 此处作为测试写死一个用户,实际使用时调用service获取当前用户
  23. CurrUserVo userVo = new CurrUserVo();
  24. userVo.setId(1L);
  25. userVo.setName("tom");
  26. return userVo;
  27. }
  28. }

WebMvc配置

  1. /**
  2. * MVC配置类
  3. */
  4. @Configuration
  5. @EnableWebMvc
  6. public class WebMvcConfig implements WebMvcConfigurer {
  7. /**
  8. * 将自定义解析器注入bean
  9. */
  10. @Bean
  11. public CurrUserArgumentResolver currUserArgumentResolver() {
  12. return new CurrUserArgumentResolver();
  13. }
  14. /**
  15. * 添加自定义解析器
  16. */
  17. @Override
  18. public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
  19. argumentResolvers.add(currUserArgumentResolver());
  20. }
  21. }
  1. @RestController
  2. public class IndexController {
  3. @GetMapping("currUser")
  4. public CurrUserVo currUser(@CurrUser CurrUserVo currUser) {
  5. return currUser;
  6. }
  7. }

如果实际使用时只需要获取用户ID,则(以Long类型为例)

  • CurrUserArgumentResolver
    • supportsParameter中的CurrUserVo.class改为Long.class
    • resolveArgument的返回参数修改为Long,且获取用户的代码直接返回用户ID
  • Controller
    • 方法的入参改为@CurrUser Long currUserId

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK