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部 &lt ...

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)打开蓝 ...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值