Springboot中使用自定义参数注解获取 token 中用户数据
使用自定义参数注解获取 token 中User数据
使用背景
在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤
- 拦截器中截获token
- TokenUtil工具类解析token中的用户信息
- 把解析结果存入到成员变量中
- controller中通过TokenUtil工具类提供的静态方法获取用户信息
下面是过程示例代码
/*--------1.拦截器中获取---------*/
String token =request.getHeader("token")
/*--------2.解析---------*/
//如果没过期且有效
if(!TokenUtil.isExpire(token)){
//解析token把结果存入成员变量
TokenUtil.decode(token);
}
/*--------3.controller中获取---------*/
User currentUser=TokenUtil.getUser();
看上去也没什么复杂指处,但是如果在每个Controller中都加上一句
User currentUser=TokenUtil.getUser();
感觉有些多余(潜意识知道肯定有更简洁的方法能减少这里所写代码)
下面介绍一种使用自定义参数注解的方法简化获取结果
最后预期达到的效果
@{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 token=request.getHeader("token");
//判断路径需要拦截
//....code
//如果token有效
if(!TokenUtil.isExpire(token)){
User user = TokenUtil.getUser(token);
//我们将解析的用户结果先放入session中
request.getSession().setAttribut("currentUser",user);
}
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
return methodParameter.getParameterAnnotation(CurrentUser.class) != null &&methodParameter.getParameterType() == User.class;
}
/**
* 注入参数值
*/
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
//取得HttpServletRequest
HttpServletRequest request= (HttpServletRequest) nativeWebRequest.getNativeRequest();
//取出session中的User
return (User)request.getSession().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());
}
/**
* 注册拦截器
* @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;
}
到此就实现了预期的结果,回头看发现虽然多写了不少代码,但是在用的时候还是更加简洁明了,美丽大方(给自己比个❤)
Springboot中使用自定义参数注解获取 token 中用户数据的更多相关文章
- SpringBoot版不需要配置文件注解获取当前登录用户
本文讯(2019年3月30日 飞快的蜗牛博客) 我是一个懒人,很久不写博客,想起来看到也不一定会写,只有心血来潮的时候写写,"钱塘江上潮信来,今日方知我是我"...... 空杯 ...
- Spring boot中普通工具类不能使用@Value注入yml文件中的自定义参数的问题
在写一个工具类的时候,因为要用到yml中的自定义参数,使用@Value发现值不能正常注入,都显示为null: yml文件中的自定义格式 调用工具类的时候不能new的方式 要使用@Autowired的方 ...
- [转]Java中实现自定义的注解处理器
Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的<简单实现ButterKnife的注解功能& ...
- 传递多个参数并获取Web API的数据
近段时间学习Web Api觉得非常有意思.默认的路由情况之下,获取数据时,它不必指定Action操作名. 还有另外感想,就是自从学习asp.net MVC之后,加上jQuery,让Insus.NET已 ...
- jQuery遍历table中的tr td并获取td中的值
jQuery遍历table中的tr td并获取td中的值 $(function(){ $("#tableId tr").find("td").each(func ...
- [K/3Cloud] 动态表单打开时传递一个自定义参数并在插件中获取
插件中在调用动态表单时,通过DynamicFormShowParameter的CustomParams,增加自定义的参数. /// <summary> /// 库存查询 /// </ ...
- SpringMVC中post请求参数注解@requestBody使用问题
一.httpClient发送Post 原文https://www.cnblogs.com/Vdiao/p/5339487.html public static String httpPostWithJ ...
- SpringMVC中的自定义参数绑定案例
由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型.所以需要自定义参数绑定.前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适 ...
- XAF 框架中,自定义参数动作(Action),输入参数的控件可定义,用于选择组织及项目
XAF 框架中,如何生成一个自定义参数动作(Action),输入参数的控件可定义? 参考文档:https://documentation.devexpress.com/eXpressAppFramew ...
随机推荐
- MongoDB 学习笔记之 索引
索引: db.media.createIndex({"Tracklist": 1}) 1表示升序 -1表示降序 我们要着重看一下对数组创建索引的情况. 构建一个集合:db.medi ...
- vue自定义指令,比onerror更优雅的方式实现当图片加载失败时使用默认图,提供三种方法
首先,来看下效果图(演示一下图片正常加载与加载失败时的效果) 在线体验地址:https://hxkj.vip/demo/vueImgOnerror/ 一.常规方法解决 我们都知道,img标签支持one ...
- Linux下格式化恢复USB启动优盘
问题描述:优盘制作成启动盘安装操作系统,但是后边使用时发现无法格式化,提示 This partition cannot be modified because it contains a partit ...
- java中的Collection和Collections
Collection是集合类的上级接口,继承他的接口主要有Set和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作.
- 运维自动化神器ansible之user模块
运维自动化神器ansible之user模块 一.概述 user模块 可管理远程主机上的 用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作. 二.参数介绍 name: 用于指定操作 ...
- 安装高可用Hadoop生态 (二) 安装Zookeeper
2. 安装Zookeeper 2.1. 解压程序 ※ 3台服务器分别执行 .tar.gz -C/opt/cloud/packages /opt/cloud/bin/zookeeper /conf ...
- Liang-Barsky算法
Liang-Barsky算法 在Cohen-Sutherland算法提出后,梁友栋和Barsky又针对标准矩形窗口提出了更快的Liang-Barsky直线段裁剪算法. 梁算法的主要思想: (1)用参数 ...
- 深入理解 web 协议(一)- http 包体传输
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/WlT8070LlrnSODFRDwZsUQ作者:吴越 开坑这个系列的原因,主要是在大前端学习的 ...
- Display 1 No cameras rendering
解决: 点击Main Camera ,
- [JZOJ5456]【NOIP2017提高A组冲刺11.6】奇怪的队列
Description nodgd的粉丝太多了,每天都会有很多人排队要签名.今天有