🤓
blog-article
  • Introduction
  • 面试题
    • 1. 输入url发生了什么
  • Personal Works
    • 1. 简单的Web图床
  • CSS动画笔记
    • 1.transition 属性
    • 2.transition 实例
  • css 笔记
    • 1. box-shadow 阴影
    • 2. columns 设置列宽和列数
    • 3. 伪元素after与before
  • html 笔记
    • 1. 不常用的h5标签杂记
  • webpack4
    • 1. 文档学习记录
    • 2. 加载CSS
    • 3. 加载less
    • 4. 加载sass
    • 5. 根据浏览器自动添加css前缀
    • 6. 图片文件处理
    • 7. 字体文件处理
    • 8. 引入jQuery
    • 9. 打包HTML文件
    • 10. 分离css插件
    • 11. babel简单使用
    • 12. 清理旧打包文件插件
    • 13. 拷贝静态资源
  • javascript
    • 1. js获取某年某月的天数
  • npm
    • 2. JSON.stringify()完整用法
    • 1. 入门篇
    • 2. 进阶篇
  • Node.js
    • 1. 使用koa-body中间件后ctx.request.body内容为空
    • 2. uni-app使用Node+Koa2接收上传的文件
  • SQL
    • 1. 查询
    • 2. 插入
    • 3. 修改
    • 4. 删除
    • 5. 期末复习
  • Git
    • 1. git add命令后出现another git process...问题
    • 2. 将文件从暂存区移除
  • vue-cli
    • 1. vue-cli(脚手架)引入vue.config.js文件后热更新失效,每次保存都会刷新页面
  • uni-app
    • 1. uni-app中不使用scroll-view组件,监听页面滑直底部事件
  • 设计模式
    • 创建型模式
    • 单例模式
    • 工厂模式
    • 抽象工厂模式
  • Spring boot
    • 1. 使用自定义参数注解获取 token 中User数据
  • IDEA
    • 1. 设置maven项目的默认配置
  • Linux
    • 1.常用命令
    • 2.常用基础命令2
    • 3.linux目录介绍
    • 4. vi编辑器使用
    • 5.用户管理
    • 6. 文件属性与权限操作
    • 7. 文件归档与解压缩
    • 8. gcc的基本用法
    • 9. gdb调试器的基本用法
    • 10. Makefile基本用法
  • shell
    • shell与crontab定时器的结合
    • 1. shell 变量与常见符号
    • 2. shell中的四则运算符
    • 3. 条件判断
    • 4. 输入输出
    • 5. 输出彩色的内容
    • 6. 流程控制
    • 7. 函数
  • Docker
  • 嵌入式系统给结构及原理
  • 学校课程笔记
    • 1. java EE 复习
    • 2. 马原复习论述题
    • 3. 嵌入式软件技术复习
    • 4. 嵌入式操作系统复习
    • 5. 马原选择题
    • 6. 马原辨析题
    • 7. 马原材料题
    • 8. 计网学习笔记
    • 9. 计网复习
      • 1. 第一章
Powered by GitBook
On this page
  • 使用背景
  • 最后预期达到的效果
  • 正文开始
  • 1. 拦截器中的代码(GlobalInterceptor.java)
  • 2. 注解类 (CurrentUser.java)
  • 3. CurrentUser注解实现类(CurrentUserHandlerMethodArgReslover.java)
  • 4. 在SpringBoot启动类中注册 注解的实现类与拦截器(ServerApplication.java)
  • 5. 在Controller中使用

Was this helpful?

  1. Spring boot

1. 使用自定义参数注解获取 token 中User数据

使用背景

在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤

  1. 拦截器中截获token

  2. TokenUtil工具类解析token中的用户信息

  3. 把解析结果存入到成员变量中

  4. 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;
}

到此就实现了预期的结果,回头看发现虽然多写了不少代码,但是在用的时候还是更加简洁明了,美丽大方(给自己比个❤)

PreviousSpring bootNextIDEA

Last updated 5 years ago

Was this helpful?