jjwt的token机制+ThreadLocal,模拟登录

news2024/11/16 18:03:08

一、什么是jjwt?jwt怎么生成token?

JWT实现token机制_java jwt token_java-zh的博客-CSDN博客

二、什么是ThreadLocal?

ThreadLocal详解-CSDN博客

三、准备的jar

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.14</version>
        </dependency>

四、代码实现

ThreadLocalUtils工具类


import java.util.HashMap;
import java.util.Map;

/**
 * @author zhong
 * @describe 线程池缓存工具
 * @date 2023/11/16 10:55
 */
public class ThreadLocalUtils {
    private static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<Map<String, Object>>();

    /**
     * 向ThreadLocal缓存值
     *
     * @param key   要缓存的KEY
     * @param value 要缓存的VALUE
     */
    public static void set(String key, Object value) {
        if (!isCaheIsNull()) {
            threadLocal.get().put(key, value);
        } else {
            Map<String, Object> vmap = new HashMap<>();
            vmap.put(key, value);
            threadLocal.set(vmap);
        }
    }

    /**
     * 从ThreadLocal里获取缓存的值
     *
     * @param key 要获取的数据的KEY
     * @return 要获取的值
     */
    public static Object getCache(String key) {
        Map<String, Object> map = threadLocal.get();
        if (isCaheIsNull()) {
            return null;
        }
        if (map.containsKey(key)) {
            return map.get(key);
        } else {
            return null;
        }
    }

    /**
     * 根据KEY移除缓存里的数据
     *
     * @param key
     */
    public static void removeByKey(String key) {
        if (isCaheIsNull()) {
            return;
        } else {
            threadLocal.get().remove(key);
        }
    }

    /**
     * 移除当前线程缓存
     * 用于释放当前线程threadlocal资源
     */
    public static void remove() {
        threadLocal.remove();
    }

    private static boolean isCaheIsNull() {
        return threadLocal.get() == null;
    }
}

jjwt实现的工具类在上面的文章有写,这里就不写了

实体类

@Data
@Accessors(chain = true)
public class UserTest {

    /**
     * 用户id
     */
    private Long userId;
    /**
     * 用户名称
     */
    private String userName;
    /**
     * 年龄
     */
    private Integer age;

    /**
     * 角色id
     */
    private Integer roleId;
}

拦截器配置

@Configuration
public class LoginConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册TestInterceptor拦截器
        InterceptorRegistration registration = registry.addInterceptor(loginInterceptor);
        registration.addPathPatterns("/**");//所有路径都被拦截
        registration.excludePathPatterns( // 添加不拦截路径
                "/base/getToken"
        );
    }
}
@Component
public class LoginInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("token");
        if(StringUtils.isEmpty(token)){
            return false;
        }
        Map<String, Object> stringObjectMap = JWTUtil.extractInfo(token, "user:login");
        if(CollectionUtils.isEmpty(stringObjectMap)){
            return false;
        }
        UserTest loginUser = new UserTest();
        loginUser.setRoleId((Integer) stringObjectMap.get("roleId"));
        loginUser.setUserId(Long.valueOf(stringObjectMap.get("userId")+""));
        loginUser.setUserName((String) stringObjectMap.get("userName"));
        ThreadLocalUtils.set("userInfo",loginUser);
        //刷新token过期时间
        Date ecpiration = new Date(System.currentTimeMillis() + 6000000L);
        Jwts.builder().setExpiration(ecpiration);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
    }

}

controller实现

@RestController
@RequestMapping("/base")
public class TestController {

    @GetMapping("/getToken")
    public String getToken() throws Exception {
        UserTest userTest = new UserTest().setUserId(134288L).setUserName("zhong").setAge(10).setRoleId(2);
        //转成map
        Map<String, Object> map = (Map) JSON.parse(JSON.toJSONString(userTest));
        String token = JWTUtil.generateToken(map, "user:login");
        ThreadLocalUtils.set("token", token);
        System.out.println("生成token");
        return token;
    }

    @GetMapping("/checkToken")
    public String checkToken() {
        UserTest userTest = (UserTest) ThreadLocalUtils.getCache("userInfo");
        // 获取完值以后,进行移除
        ThreadLocalUtils.removeByKey("userInfo");
        return JSON.toJSONString(userTest);
    }
}

五、测试

        5.1 生成token

        这里的data信息就是返回的token信息,因为这里配置了代码返回的格式,所以返回的内容在data里面,参考文档:springboot的@RestControllerAdvice作用和捕获自定义异常返回自定义结果案例-CSDN博客

        5.2 token解析

               解析的内容为token加密的内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1235612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BUUCTF--[ACTF2020 新生赛]Include

目录 1、本题详解 2、延伸拓展 1、本题详解 访问题目链接 有一个tips的链接&#xff0c;我们点击 请求了file&#xff0c;内容是flag.php的内容&#xff1a;Can you find out the flag? 尝试请求一下index.php 并没有发现什么信息 flag.php也没发现什么 尝试爆破一下它的…

Linux学习第43天:Linux 多点电容触摸屏实验:难忘记第一次牵你手的温存

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 人都是性情中人&#xff0c;如果把学习当做自己的女朋友&#xff0c;对她细致入微、掏心掏肺、有耐心有恒心&#xff0c;终会修成正果。 而我们本节需要学习的电…

解决:ERR This instance has cluster support disabled

问题描述 在使用Redisson做分布式锁&#xff0c;连接redis时&#xff0c;提示以下错误&#xff1a; 问题定位 通过指令&#xff1a; cluster nodes查看&#xff0c;发现 出现这种提示的原因&#xff0c;是因为此Redis实例已经禁用了集群(默认状态下是禁用状态)。 解决 …

vue年季度月联动筛选(el-cascader实现)

默认显示当年当季当月 <label class"font-weight">时间范围</label> <el-cascaderplaceholder"请选择":options"timeOption"filterableclearablechange-on-selectv-model"timeRange":props"{emitPath: true}&quo…

Redis常用的八种场景

作为一名 Java后端人员&#xff0c;对 Redis肯定并不陌生&#xff0c;Redis作为一种内存数据库&#xff0c;以其速度之快在编程的舞台上纵横多年&#xff0c;那么&#xff0c;Redis到底适合哪些业务场景&#xff1f;今天就来聊一聊。 1. 缓存/数据库 缓存&#xff08;Cache&am…

Foodpanda API连接的艺术:无代码开发如何集成营销系统和广告推广工具

连接Foodpanda和电商平台的无代码开发 Foodpanda不仅是一家提供快速外卖服务的国际品牌&#xff0c;而且其创新的技术解决方案还能帮助电商企业优化系统运营。通过无代码开发的方法&#xff0c;即使没有专业的API开发知识&#xff0c;商家也能实现高效的电商系统和客服系统连接…

基于Android个人理财家庭收支系统uniAPP+vue -hbuiderx-微信小程序vj9n8

摘 要 个人理财APP设计的目的是为用户提供对活动信息和提醒信息管理等方面的平台。 与PC端应用程序相比&#xff0c;个人理财的设计旨在为用户提供一个个人理财信息的管理。用户可以通过APP及时收入信息和支出信息&#xff0c;并对提醒消息进行查看等。 个人理财APP是在Androi…

小程序中打印机纸张都支持哪些尺寸?

在小程序中添加打印机功能是一项非常实用的功能&#xff0c;它可以让用户方便地将小程序中的内容打印出来。然而&#xff0c;当用户想要打印内容时&#xff0c;他们可能会关心打印纸张支持哪些尺寸。打印机分为四种打印机&#xff1a;小票、标签、发货单和电子面单。下面具体介…

【Python常用函数】一文让你彻底掌握Python中的numpy.add函数

大数据时代的到来,使得很多工作都需要进行数据挖掘,从而发现更多有利的规律,或规避风险,或发现商业价值。而大数据分析的基础是学好编程语言。 文章目录 一、安装numpy包二、add函数定义三、add函数实例1 简单数组相加2 广播不同形状的数组3 使用out参数指定输出数组4 两个…

满二叉树你需要了解一下

满二叉树介绍 满二叉树&#xff08;Full Binary Tree&#xff09;是一种特殊的二叉树&#xff0c;其中每个节点都有两个子节点或没有子节点。换句话说&#xff0c;满二叉树的每个层级都是完全填满的。这种树结构具有一定的平衡性&#xff0c;其深度和节点数量之间存在明确的关…

python内容榜第三名

这是家常帖。 最近沉迷整理知识&#xff0c;和大家一起共同学习&#xff0c;共同进步。 越来越爱写博客被大家阅读认可的感觉了。我辛苦学习总结来的成果被大家喜爱。 今天荣登python领域内容榜 榜三&#xff0c;给了我很大的信心去坚持做这件事&#xff0c;知识传播&#xf…

基于JavaWeb的智慧停车管理系统设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

玩转系统|长亭雷池WAF详细使用教程——深入了解

目录 配置防护站点 界面操作​ 如何配置域名、端口、上游服务器​ 工作原理​ 在单独设备上部署雷池&#xff08;推荐&#xff09;​ 直接在网站服务器上部署雷池​ 和其他反代设备一起部署的情况​ 配置后网站无法访问&#xff0c;如何排查​ 测试防护效果 确认网站…

深度学习动物识别 - 卷积神经网络 机器视觉 图像识别 计算机竞赛

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

imx VPU解码分析4-wrap与hantro的关系

前面已经分析了wrap和hantro&#xff0c;但是二者是如何结合的&#xff0c;wrap是如何封装hantro的&#xff0c;提供了哪些接口&#xff0c;封装了哪些细节还不太清楚&#xff0c;此文来探究下。这里还是只关注解码。 imx VPU解码分析1-wrap-CSDN博客 imx VPU解码分析2-hantr…

HarmonyOS ArkTSTabs组件的使用(六)

Tabs组件的使用 ArkUI开发框架提供了一种页签容器组件Tabs&#xff0c;开发者通过Tabs组件可以很容易的实现内容视图的切换。页签容器Tabs的形式多种多样&#xff0c;不同的页面设计页签不一样&#xff0c;可以把页签设置在底部、顶部或者侧边。 Tabs组件的简单使用 Tabs组件…

mac添加Chrome插件的方法

如果是.crx的插件 更改后缀crx为zip 后续步骤同下文.zip文件 如果是.zip的插件 使用终端进行解压 注意不要用解压工具解压&#xff0c;一定要用终端&#xff0c;命令行解压 // 进入到“插件名.zip”文件的目录下&#xff0c;输入下面命令&#xff1a; unzip 插件名.zip -…

【项目管理】甘特图(2)——甘特图教程

哈喽啊&#xff0c;你好&#xff0c;我是雷工。 通过上节初步认识了甘特图&#xff0c;本节学习如何一步步创建甘特图&#xff0c;以下为学习笔记。 一、样例展示 下边记录创建甘特图的操作步骤&#xff0c;完成的实际效果如下图所示&#xff1a; 实例图的上端展示项目的重要…

mysql 查询

-- 多表查询select * from tb_dept,tb_emp; 内来链接 -- 内连接 -- A 查询员工的姓名 &#xff0c; 及所属的部门名称 &#xff08;隐式内连接实现&#xff09;select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.idtb_emp.id;-- 推荐使用select a.name,b.n…

树与二叉树堆:堆

堆的概念&#xff1a; 一般是把数组的数据在逻辑结构上看成一颗完全二叉树&#xff0c;如下图所示。 注意&#xff1a;别将C语言中的堆和数据结构的堆混为一谈&#xff0c;本文所讲的数据结构的堆是一种完全二叉树&#xff0c;而C语言中的堆其实是一种内存区域的划分 堆的分类…