HandlerMethodArgumentResolver用于统一获取当前登录用户

本文介绍了在SpringBoot中如何利用HandlerMethodArgumentResolver进行统一登录用户信息的获取。通过创建自定义的拦截器AuthenticationInterceptor、参数注解@CurrentUser和方法参数解析器CurrentUserMethodArgumentResolver,实现了在Controller方法中便捷地获取当前登录用户。同时,展示了如何将JSON、XML和多个请求参数转换为Java对象,并注册自定义的HandlerMethodArgumentResolver实现类。
摘要由CSDN通过智能技术生成

这里记录回顾一些知识,不然就快忘记啦。

  • 环境:SpringBoot 2.0.4.RELEASE
  • 需求:很多Controller方法,刚进来要先获取当前登录用户的信息,以便做后续的用户相关操作。
  • 准备工作:前端每次请求都传token,后端封装一方法tokenUtils.getUserByToken(token),根据token解析得到currentUserInfo。

  这是一个常见的业务需求,为实现这个需求,有以下几种解决方案:

一、最原始直接

  即,每个Controller开始,先调用tokenUtils.getUserByToken(token),不够优雅。

二、AOP

  AOP可以解决很多切面类问题,思路同Spring AOP来自定义注解实现审计或日志记录,将currentUser放到request里;比起拦截器稍重。

三、拦截器+方法参数解析器

  使用mvc拦截器HandlerInterceptor+方法参数解析器HandlerMethodArgumentResolver最合适。

  SpringMVC提供了mvc拦截器HandlerInterceptor,包含以下3个方法:

  • preHandle
  • postHandle
  • afterCompletion

  HandlerInterceptor经常被用来解决拦截事件,如用户鉴权等。另外,Spring也向我们提供了多种解析器Resolver,如用来统一处理异常的HandlerExceptionResolver,以及今天的主角        HandlerMethodArgumentResolverHandlerMethodArgumentResolver是用来处理方法参数的解析器,包含以下2个方法:

  • supportsParameter(满足某种要求,返回true,方可进入resolveArgument做参数处理)
  • resolveArgument

知识储备已到位,接下来着手实现,主要分为三步走:

  1. 自定义权限拦截器AuthenticationInterceptor拦截所有request请求,并将token解析为currentUser,最终放到request中;
  2. 自定义参数注解@CurrentUser,添加至controller的方法参数user之上;
  3. 自定义方法参数解析器CurrentUserMethodArgumentResolver,取出request中的user,并赋值给添加了@CurrentUser注解的参数user。

 

使用方式

要使用 HandlerMethodArgumentResolver,需要遵循以下步骤:

  1. 创建一个自定义的 HandlerMethodArgumentResolver 实现类。
  2. 在该类中实现 supportsParameter() 方法和 resolveArgument() 方法。
  3. 在 Spring Boot 应用程序中注册该类。

创建自定义的 HandlerMethodArgumentResolver 实现类

        为了将 HTTP 请求参数转换为 Java 对象,我们需要创建一个自定义的 HandlerMethodArgumentResolver 实现类。在这个类中,我们需要实现 supportsParameter() 方法和 resolveArgument() 方法。

supportsParameter() 方法

        在 supportsParameter() 方法中,我们需要检查方法参数是否与我们要转换的 Java 类型相同。如果是,返回 true,否则返回 false

resolveArgument() 方法

        在 resolveArgument() 方法中,我们需要将 HTTP 请求参数转换为 Java 对象。为此,我们可以使用 NativeWebRequest 对象来获取请求参数,然后将其转换为 Java 对象。

注册自定义的 HandlerMethodArgumentResolver 实现类

        要在 Spring Boot 应用程序中使用自定义的 HandlerMethodArgumentResolver 实现类,我们需要将其注册到应用程序上下文中。为此,我们可以创建一个 @Configuration 类,并实现 WebMvcConfigurer 接口。在这个类中,我们需要重写 addArgumentResolvers() 方法,并将自定义的 HandlerMethodArgumentResolver 实现类添加到参数解析器列表中。

@Configuration

public class AppConfig implements WebMvcConfigurer {

@Override

public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {

resolvers.add(new CustomHandlerMethodArgumentResolver());

}

}

3.1 自定义权限拦截器

  自定义权限拦截器AuthenticationInterceptor,需实现HandlerInterceptor。在preHandle中调用tokenUtils.getUserByToken(token),获取到当前用户,最后塞进request中,如下:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import edp.core.utils.TokenUtils;
import edp.davinci.core.common.Constants;
import edp.davinci.model.User;
 
public class AuthenticationInterceptor implements HandlerIntercept
HandlerMethodArgumentResolverSpring框架提供的一个接口,用于解析方法参数。它的作用是将请求中的参数值绑定到方法的参数上,使得方法能够正确地获取到请求中的数据。 HandlerMethodArgumentResolver接口定义了一个方法resolveArgument,该方法用于解析方法参数。具体的解析逻辑由实现了HandlerMethodArgumentResolver接口的类来实现。Spring框架提供了一些默认的实现类,如RequestParamMethodArgumentResolver和PathVariableMethodArgumentResolver。 RequestParamMethodArgumentResolver用于解析@RequestParam注解修饰的方法参数,它会根据请求中的参数名和方法参数名进行匹配,并将匹配到的参数值绑定到方法参数上。 PathVariableMethodArgumentResolver用于解析@PathVariable注解修饰的方法参数,它会根据请求中的路径变量和方法参数名进行匹配,并将匹配到的路径变量值绑定到方法参数上。 下面是一个使用HandlerMethodArgumentResolver的示例代码: ```java @RestController public class UserController { @GetMapping("/user/{id}") public User getUser(@PathVariable("id") Long id) { // 根据id查询用户信息 User user = userService.getUserById(id); return user; } } ``` 在上述代码中,getUser方法使用了@PathVariable注解修饰的id参数。当请求路径为"/user/123"时,PathVariableMethodArgumentResolver会将路径中的123绑定到id参数上,从而获取到对应的用户信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值