packageio.xiongdi.resolver;importio.xiongdi.annotation.LoginUser;importio.xiongdi.entity.UserEntity;importio.xiongdi.interceptor.AuthorizationInterceptor;importio.xiongdi.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.core.MethodParameter;importorg.springframework.stereotype.Component;importorg.springframework.web.bind.support.WebDataBinderFactory;importorg.springframework.web.context.request.NativeWebRequest;importorg.springframework.web.context.request.RequestAttributes;importorg.springframework.web.method.support.HandlerMethodArgumentResolver;importorg.springframework.web.method.support.ModelAndViewContainer;/*** 方法参数解析器接口,这个接口是SpringMVC参数解析绑定的核心接口。
* 不同的参数类型绑定都是通过实现这个接口来实现。
* 也可以通过实现这个接口来自定义参数解析器
*@authorwujiaxing
* @date 2019-06-30*/@Componentpublic class LoginUserHandlerMethodArgumentResolver implementsHandlerMethodArgumentResolver {
@AutowiredprivateUserService userService;/*** 该解析器是否支持parameter参数的解析
*@paramparameter 拦截到的参数
*@return是否符合我们的拦截规则
*
* isAssignableFrom方法作用是判断参数类型是否为UserEntity类或是父类或是父接口
*
*/@Overridepublic booleansupportsParameter(MethodParameter parameter) {return parameter.getParameterType().isAssignableFrom(UserEntity.class) && parameter.hasParameterAnnotation(LoginUser.class);}/***
* 将方法参数从给定请求(webRequest)解析为参数值并返回
* 请求顺序:
* 1.进入拦截器,拦截有token请求头的用户,说明是验证过的
* 2.进入自定义参数解析器supportsParameter方法,解析带有LoginUser注解并且类UserEntity或父类的参数
* 3.进入自定义参数解析器resolveArgument方法,将存在作用域里的userid拿出来查询到user用户信息,赋给UserEntity参数
*
*@paramparameter
*@parammavContainer
*@paramwebRequest
*@parambinderFactory
*@return*@throwsException*/@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throwsException {//从请求作用域中获取userid
Object o =webRequest.getAttribute(AuthorizationInterceptor.USER_KEY, RequestAttributes.SCOPE_REQUEST);if (o == null) {return null;
}
UserEntity userEntity= userService.getById((long) o);returnuserEntity;
}
}