Springboot中使⽤⾃定义参数注解获取token中⽤户数据
使⽤⾃定义参数注解获取 token 中User数据
使⽤背景
在springboot项⽬开发中需要从token中获取⽤户信息时通常的⽅式要经历⼏个步骤
1. 中截获token
2. TokenUtil⼯具类解析token中的⽤户信息
3. 把解析结果存⼊到成员变量中
4. controller中通过TokenUtil⼯具类提供的静态⽅法获取⽤户信息
下⾯是过程⽰例代码
/*--------1.中获取---------*/
String token =Header("token")
/
*--------2.解析---------*/
//如果没过期且有效
if(!TokenUtil.isExpire(token)){
//解析token把结果存⼊成员变量
TokenUtil.decode(token);
}
/*--------3.controller中获取---------*/
User User();
看上去也没什么复杂指处,但是如果在每个Controller中都加上⼀句
User User();感觉有些多余(潜意识知道肯定有更简洁的⽅法能减少这⾥所写代码)
下⾯介绍⼀种使⽤⾃定义参数注解的⽅法简化获取结果
最后预期达到的效果
@{RequestMethod}Mapping(value="path")
public Object methodName(@CurrentUser User user){
//...code
}
正⽂开始
1. 中的代码(GlobalInterceptor.java)
public class GlobalInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String Header("token");
//判断路径需要拦截
//....code
//如果token有效
if(!TokenUtil.isExpire(token)){
User user = User(token);
//我们将解析的⽤户结果先放⼊session中
}
return true;
}
}
2. 注解类 (CurrentUser.java)
@Target({ElementType.PARAMETER})//Annotation所修饰的对象范围:⽅法参数
@Retention(RetentionPolicy.RUNTIME)//Annotation被保留时间:运⾏时保留(有效)
@Documented//标记注解:java⼯具⽂档化
public @interface CurrentUser {
}
3. CurrentUser注解实现类(CurrentUserHandlerMethodArgReslover.java)
public class CurrentUserHandlerMethodArgReslover implements HandlerMethodArgumentResolver {
/**
* 判断是否⽀持使⽤@CurrentUser注解的参数
*/
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
//如果该参数注解有@CurrentUser且参数类型是User
ParameterAnnotation(CurrentUser.class) != null &&ParameterType() == User.class;
}
/**
* 注⼊参数值
*/
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBin
derFactory) throws Exception { //取得HttpServletRequest
HttpServletRequest request= (HttpServletRequest) NativeRequest();
//取出session中的User
return (Session().getAttribute("currentUser");
}
}
4. 在SpringBoot启动类中注册注解的实现类与(ServerApplication.java)
@SpringBootApplication
public class ServerApplication extends WebMvcConfigurationSupport {
/**
* 启动⼊⼝
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class,args);
}
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers){
//注册@CurrentUser注解的实现类
argumentResolvers.add(new CurrentUserHandlerMethodArgReslover());
}
/**
springboot和过滤器
* 注册
* @param registry
*/
@Override
protected void addInterceptors(InterceptorRegistry registry {
//注册
registry.addInterceptor(new GlobalInterceptor().addPathPatterns("/*/api/**");
registry.addInterceptor(new TestInterceptor().addPathPatterns("/*/api/test/**");
super.addInterceptors(registry);
}
}
5. 在Controller中使⽤
@GetMapping(value="/demo/api/testget")
public Object getTest(@CurrentUser User currentUser){
System.out.println(currentUser);
return currentUser;
}
到此就实现了预期的结果,回头看发现虽然多写了不少代码,但是在⽤的时候还是更加简洁明了,美丽⼤⽅(给⾃⼰⽐个❤)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论