java 获取自定义参数类型_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 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版不需要配置文件注解获取当前登录用户
本文讯(2019年3月30日 飞快的蜗牛博客) 我是一个懒人,很久不写博客,想起来看到也不一定会写,只有心血来潮的时候写写,"钱塘江上潮信来,今日方知我是我"...... 空杯 ...
Spring boot中普通工具类不能使用@Value注入yml文件中的自定义参数的问题
在写一个工具类的时候,因为要用到yml中的自定义参数,使用@Value发现值不能正常注入,都显示为null: yml文件中的自定义格式 调用工具类的时候不能new的方式 要使用@Autowired的方 ...
[转]Java中实现自定义的注解处理器
Java中实现自定义的注解处理器(Annotation Processor) 置顶2016年07月25日 19:42:49 阅读数:9877 在之前的
传递多个参数并获取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,增加自定义的参数. /// /// 库存查询 /// ...
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 ...
随机推荐
Sed、Awk单行脚本快速参考
文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s\n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行. # 这样在输出的文本 ...
1、C#基础:变量、运算符、分支、循环、枚举、数组、方法 <;转>;
转自:海盗船长 链接:http://www.cnblogs.com/baidawei/p/4701504.html#3241882 C#..Net以及IDE简介 一.什么是.Net? .Net指 .N ...
CSS样式----图文详解(二):css属性
主要内容 CSS的单位 字体属性 文本属性 背景属性 列表属性 盒子模型 定位属性:position.float.overflow.z-index等 导航栏的制作 鼠标的属性cursor 滤镜的介绍 ...
Pixar Shorts 皮克斯动画短片全集
[原创短片](Theatrical Shorts)16部 < ...
eclipse +VISUALSVN SERVER 创建版本控制器,防止误操作(可视化操作,简单方便,不需要修改配置文件)
第一步:为eclipse安装Subclipse插件 打开eclipse,点击help-->Install New Software...弹出对话框,点击Add..(新增),以http://sub ...
移植net-snmp到开发板(mini210)
1.安装交叉编译工具arm-linux-gcc 2.下载net-snmp源码安装包 3.解压安装包 4../configure --build=i686-linux --host=arm-linux ...
codeforces 675B B. Restoring Painting(暴力枚举)
题目链接: B. Restoring Painting time limit per test 1 second memory limit per test 256 megabytes input s ...
Linq101-Miscellaneous
using System; using System.Collections.Generic; using System.Linq; namespace Linq101 { class Miscell ...
js中document的用法
document.title //设置文档标题等价于HTML的title标签document.bgColor //设置页面背景色document.fgColor //设置前景色(文本颜色)docume ...
详细解析BluetoothAdapter的详细api
(1)开关状态值 (2)扫描状态值 (3)蓝牙操作接收的广播 (4)蓝牙操作请求的广播 (5)附加域 (6)错误码 (1)获取蓝牙适配器 (2)获取state状态方法 (3)蓝牙是否可用 (4)打开蓝 ...
java 获取自定义参数类型_Springboot中使用自定义参数注解获取 token 中用户数据...相关推荐
- Java注解参数类型枚举值_EffectiveJava-5-枚举和注解
用enum代替int常量 1. int枚举: 引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式. int枚举模式是类型不安全的,例如下面两组常量:性别和 ...
- python参数类型限定_python限定方法参数类型、返回值类型、变量类型等|python3教程|python入门|python教程...
https://www.xin3721.com/eschool/python.html typing模块的作用 自python3.5开始,PEP484为python引入了类型注解(type hints ...
- python函数参数类型及顺序_python函数参数类型及其顺序
根据inspect模块官文文档中关于函数参数类型的相关说明,python函数参数共有五种类型,按顺序分别为:POSITIONAL_ONLY.POSITIONAL_OR_KEYWORD.VAR_POSI ...
- HTML中注释写法 CSS中注释写法,CSS注解语法,HTML中CSS注释
CSS注释教程篇 一.CSS注解语法 在CSS代码中进行注解注释语法: /* 注解注释内容 */ 二.HTML中CSS注释 我们在HTML中直接使用style标签进行设置CSS样式,那CSS注释注解时 ...
- oracle 中的cast函数,Oracle cast函数对用户数据进行类型转换
一.cast函数 cast函数的作用是对用户输入的数据进行数据类型转换,比如用户数据的数据时number类型,小数位数是3位,我们可以将用户数据转换成整形数据int类型. cast函数的格式是cast ...
- ajax的data参数类型,JQuery.Ajax()的data参数类型
假如现在有这样一个表单,是添加元素用的. 用户名: 手机号: 生日: 我们不想使用表单submit的方式添加这个元素,我们就想使用ajax提交. 以前我们是这样实现的: 1 2 3 4 5 6 7 8 ...
- #{}不自动改参数类型_ORT-260电动打包机常规参数
ORT-260作为一款进口电动打包机,深受某些大企业喜爱.作为一款 手提式打包工具来说,却有着三种模式可转换使用:手动模式.半自动模式 全自动模式.方便简单! 但是缪罗最近发现一个问题:越是进口机对参 ...
- 自定义文章类型/分类 自由读取自定义分类
使用 get_terms 函数可以自由读自定义分类. get_terms 函数共有2个参数. 第1个是自定义分类名. 第2个是各种设置的数组. 除了自定义分类名以外,其它基本和 get_categor ...
- python函数的参数类型,Python函数的主要参数类型
形式参数(形参) 在定义函数阶段定义的参数称之为形参,相当于变量名 位置形参(普通形参) 位置形参:在函数定义阶段,按照从左到右的顺序定义 特点:必须被传值,且实参与形参按照顺序一一对应,多一个少一个 ...
最新文章
- 小程序输入框导致界面上移,在输入的时候固定住页面的解决代码
- 深入浅出计算机组成原理学习笔记:总线-计算机内部的高速公路(第42讲)
- java的环境变量classpath中加点号 ‘.’ 的作用
- LightSwitch中的权限
- service mysqld start,Failed to start mysqld.service: Access denied
- ug建模文本怎么竖着_入门到成为UG编程高手,这些步骤你不得不了解
- Vue.js前后端分离2
- 标记语言Markdown介绍以及日常使用
- Hiberbate中的一对多关联查询
- 控件时出现“未能实例化控件******,VS2008 中无法使用ACTIVEX控件的解决
- 数据结构和算法——八种常用的排序算法------基数排序的优化(队列实现)
- 软件公司内部协作平台的选型(项目/BUG/需求管理及用户支持)
- js、bootstrap、jq实现酷炫赛道风格的多功能辩论赛计时器
- 关于EnableViewState属性
- linux中快速拷贝大文件,linux下如何实现快速拷贝大文件
- IOS appstore 发布
- 【技术邻】HyperMesh复合材料建模——坐标系调整
- 大学英语四级电子照片修改过程。
- python计算平均值标准差和中位数_如何使用python求平均数、方差、中位数
- ubuntu从零开始手工编译shogun
热门文章
- windows下GPU增强终端模拟器alacritty相关配置
- c语言编程题输入两个直角边,C语言编程 直角三角形已知两边求第三边
- 学习笔记_关于switch在whlie中无限循环的解决办法_C语言
- DialogInterface内存泄露 anonymous class implements android.content.DialogInterfaces$OnClickListener...
- android 监控来电(草稿)
- android智能客户,南宁Android智能机器人批发客户至上
- 让LYNC来次真格的国际长途呼叫
- win10无法访问smb共享文件夹的解决办法
- linux(开关机,运行级别,用户及密码管理)
- 【UE4(虚幻4)蓝图】第三人称人物的奔跑,冲刺,二段跳