如何完美通过token获取用户信息(springboot)

2023-09-18 16:53:07

1. 什么是Token?

在这里插入图片描述

身份验证令牌(Authentication Token):在身份验证过程中,“token”
可以表示一个包含用户身份信息的令牌。

例如

  1. Token(JWT)是一种常见的身份验证令牌,它包含用户的身份信息(例如用户名或用户ID)以及其他相关信息,如权限或过期时间。
  2. 无意义令牌token,这种一般在获取后通过nosql查询token对应的用户信息。

当然,设计token网上大多有现成的解决方案,但是通过token如何拿个人信息呢?

2. 如何优雅的获取用户信息?

虽然token是用户凭证,但是在后端中,token是不能直接和数据进行交互的,我们需要转换成token用户信息。

解决思路:

我们大多会在过滤器filter进行token检验,在这里我们已经已经从header中解析并且验证了token了。如果我们要是再在Controller中获取header,在解决,感觉一点也不优雅。
在这里插入图片描述
我们的两种解决方案:

  1. 通过header进行解析(推荐):

哈哈哈,没想到我们还是从这种low的方法里弄的吧。 实际上nosql性能很不错,再查一次也无伤大雅,并且这种方式耦合度较低,符合代码规范。

我们可以通过注解的方式,可以尽量美观很多
1.1. 创建CurrentUserUuid接口

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUserUuid {
}

1.2. 创建oginUserHandlerMethodArgumentResolver解析器
在这里插入图片描述

@Component
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Resource
    private TokenUtil tokenUtil;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(CurrentUserUuid.class) &&
                parameter.getParameterType().isAssignableFrom(String.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
                                  NativeWebRequest request, WebDataBinderFactory factory) {
        // header中获取用户token
        String token = request.getHeader("Authorization");
        // TODO 根据userId获取User信息,这里省略,直接创建一个User对象。
        return tokenUtil.getUserToken(token);
    }
}
  1. 过滤器二次封装请求体

我们可以在第一次过滤器查的时候,把对应的信息封装到请求中,但是请求多变,get,post参数一般在不同的位置上,需要写更复杂的结构

@Override	
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)	
            throws IOException, ServletException {	
    HttpServletRequest httpRequest = (HttpServletRequest) request;	
    HttpServletResponse httpResponse = (HttpServletResponse) response;	
    String token = request.getHeader("token");	
    JWTResult result = JWTUtils.checkToken(token);	
    Long userId = result.getUserId();	
    HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(httpRequest) {	
            @Override	
            public String[] getParameterValues(String name) {	
                if (name.equals("loginUserId")) {	
                    return new String[] { userId .toString() };	
                }	
                return super.getParameterValues(name);	
            }	
            @Override	
            public Enumeration<String> getParameterNames() {	
                Set<String> paramNames = new LinkedHashSet<>();	
                paramNames.add("loginUserId");	
                Enumeration<String> names =  super.getParameterNames();	
                while(names.hasMoreElements()) {	
                    paramNames.add(names.nextElement());	
                }	
                return Collections.enumeration(paramNames);	
            }	
    };	
    chain.doFilter(requestWrapper, httpResponse);	
}

这种好处是只需要查一次,但是请求参数多变,需要写很多额外的解构去处理,并且增加了耦合度

3. 总结

我还是推荐方法1,无疑,虽然多查一次,但是结构简单,耦合度低,并且代码较为简洁。

更多推荐

论文阅读 - Natural Language is All a Graph Needs

目录摘要IntroductionRelatedWork3InstructGLM3.1Preliminary3.2InstructionPromptDesign3.3节点分类的生成指令调整3.4辅助自监督链路预测4Experiments4.1ExperimentalSetup4.2MainResults4.2.1ogbn

机器学习—非零中心化、非零中心化会带来的问题

众所周知,激活函数最好具有关于零点对称的特性,不关于零点对称会导致收敛变慢。这种说法看到几次了,但对于背后的原因却一直比较模糊,今天就来捋一捋。神经元模型如图1所示是神经网络中一个典型的神经元设计,它完全仿照人类大脑中神经元之间传递数据的模式设计。大脑中,神经元通过若干树突(dendrite)的突触(synapse),

【数据结构练习】链表面试题集锦二

目录前言:1.链表分割2.相交链表3.环形链表4.环形链表II前言:数据结构想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个必做好题锦集的系列,每篇大约5题左右。此为第二篇选择题篇,该系列会不定期更新敬请期待!1.链表分割代码:publicclassPartition{publicListNode

Hadoop-sqoop

sqoop1.Sqoop简介及原理简介:Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysq1.postgresql..)间进行数据的传递,可以将一个关系型数据库(例如:MySQL,Oracle,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关

JVM基础知识(内存区域划分,类加载,GC垃圾回收)

目录内存区域划分JVM中的栈JVM中的堆程序计数器方法区(元数据区)给一段代码,某个变量在哪个区域上?类加载类加载时机双亲委派模型GC垃圾回收机制GC实际工作过程1.找到垃圾/判定垃圾1.可达性分析(Java中的做法)2.引用计数2.清理垃圾1.标记清除2.复制算法3.标记整理分代回收(复制算法+标记整理)内存区域划分

Axios 的介绍(使用和作用)

Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中axios的作用是什么呢?axios主要是用于向后台发起请求的,还有在请求中做更多是可控功能。axios特点:从浏览器中创建XMLHttpRequests从node.js创建http请求支持PromiseAPI拦截请求和响应(就是有inte

电子科大软件系统架构设计——系统需求分析

文章目录系统需求分析需求采集研究现有文档与系统组织机构图系统规划文档工作规范文档业务单据报表问题描述文档领域专业知识现有相关软件系统与客户及相关人员进行面谈正式面谈非正式面谈典型访谈问题优缺点问卷调查法调查表问卷设计问卷调查表应用方式观察法头脑风暴法原型法原型方法分类原型法开发过程快速应用开发可视化需求建模业务流程建模

十三、MySql的视图

文章目录一、前言二、定义三、为什么使用视图四、基本使用(—)创建视图(二)案例1.修改了视图,对基表数据有影响2.修改了基表,对视图有影响3.删除视图五、视图规则和限制一、前言通过视图,可以展现基表(用来创建视图的表)的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。视图(子查询):是从一个或多个表导

linux上gitlab备份与还原

三Gitlab备份1.gitlab安装1.1添加镜像地址添加镜像地址的目的是为了提高国内用户软件下载的速度,编辑(新建)文件gitlab-ce.repo,指令:vi/etc/yum.repos.d/gitlab-ce.repo复制输入:[gitlab-ce]name=gitlab-ce#清华大学的镜像源baseurl=

使用vue-cli搭建SPA项目及使用和路由及路由嵌套的使用

目录一、介绍(1)概述(2)作用二、项目搭建SPA介绍讲述特点优点(1)检查(2)安装(3)构建(4)启动(5)导入三、路由及嵌套使用(1)路由(2)嵌套给我们的收获一、介绍(1)概述vue-cli是一个基于Vue.js的脚手架工具,用于快速搭建Vue.js项目的开发环境。它提供了一套完整的项目结构和开发工具,帮助开发

第十天:基于Ubuntu和gec6818开发板的QT图书管理系统完整项目设计

源码内容太多不一一展示,需要完整源码和ppt答辩的可以私聊我!一、开发环境开发工具Ubuntu18.04中QT5.9运行平台:Ubuntu18.04和gec6818arm开发板二、数据库mysql或sqlite3初始化(两个数据库都可)mysql初始化语句:initdatabase.sqlusemysql;insert

热文推荐