一、HandlerMethodArgumentResolver
自定义解析器需要实现HandlerMethodArgumentResolver接口。
HandlerMethodArgumentResolver接口包含两个方法:
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(MethodParameter var1);
@Nullable
Object resolveArgument(MethodParameter var1,
@Nullable ModelAndViewContainer var2, NativeWebRequest var3,
@Nullable WebDataBinderFactory var4) throws Exception;
}
方法说明:
supportsParameter:用于判定是否需要处理该参数分解,返回true为需要,并会去调用下面的方法resolveArgument。
resolveArgument:真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象。
二、定义参数解析类'
LoginUserHandlerMethodArgumentResolver.java
一定要实现HandlerMethodArgumentResolver接口
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
//登录令牌
public static final String LOGIN_TOKEN_KEY = "Totoro-Token";
/**
* 支持参数
*
* @param methodParameter
* @return
*/
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
//获取方法参数,LoginUser自定义注解,在公共模块
return methodParameter.getParameterType().isAssignableFrom(Integer.class) &&
methodParameter.hasParameterAnnotation(LoginUser.class);
}
/**
* 进行参数解析
*
* @param methodParameter
* @param modelAndViewContainer
* @param nativeWebRequest
* @param webDataBinderFactory
* @return
* @throws Exception
*/
@Override
public Object resolveArgument(MethodParameter methodParameter,
ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory)
throws Exception {
// 1.TODO 获取头令牌
String token = nativeWebRequest.getHeader(LOGIN_TOKEN_KEY);
if (token == null || token.isEmpty()) {
return null;
}
// 2 .TODO 进行令牌比较
return UserTokenManager.getUserId(token);
}
}
三、Web配置
public class WebMvcConfiguration implements WebMvcConfigurer {
/**
*添加解析器以支持自定义控制器方法参数类型。
*这不会覆盖用于解析处理程序方法参数的内置支持。
* @param argumentResolvers
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new LoginUserHandlerMethodArgumentResolver());
}
}
四、自定义注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}
五、令牌管理
public class UserTokenManager {
public static String generateToken(Integer id) {
JwtUtils jwtUtils = new JwtUtils();
//创建令牌
return jwtUtils.createToken(id);
}
public static Integer getUserId(String token) {
//获取令牌
JwtUtils jwtUtils = new JwtUtils();
Integer userId = jwtUtils.verifyTokenAndGetUserId(token);
if(userId == null || userId == 0){
return null;
}
return userId;
}
}