HandlerInterceptor+HandlerMethodArgumentResolver统一获取当前登录的用户

本文介绍了在SpringBoot中通过HandlerInterceptor和HandlerMethodArgumentResolver实现统一获取当前登录用户的方法。首先创建自定义权限拦截器,解析token获取用户信息并放入request。接着定义一个自定义参数注解@CurrentUser,以及对应的参数解析器,用于在方法参数中注入当前用户。最后,配置拦截器和参数解析器以完成整个流程。
摘要由CSDN通过智能技术生成

目录

一、最原始直接

二、AOP

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

 3.1 自定义权限拦截器

 3.2 自定义参数注解

 3.3 自定义方法参数解析器

 3.4 配置MVC


环境: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,以及今天的主角HandlerMethodArgumentResolver。HandlerMethodArgumentResolver是用来处理方法参数的解析器,包含以下2个方法:

supportsParameter(满足某种要求,返回true,方可进入resolveArgument做参数处理)
resolveArgument
 知识储备已到位,接下来着手实现,主要分为三步走:

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


 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.core.consts.Consts;
import edp.davinci.model.User;
 
public class AuthenticationInterceptor implements HandlerInterceptor {
 
    @Autowired
    private TokenUtils tokenUtils;
 
    @Override
    public boolean preHandle(HttpServletRequest request, Ht
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值