使用jwt实现登录验证

news2024/9/24 23:32:10

jwt工具类



public class JwtUtil {
    public static String key="mykey";

    public static String genToken(String username) {
        JWTCreator.Builder builder = JWT.create();
        Map<String, Object> headers=new HashMap<>();
        headers.put("typ","jwt");
        headers.put("alg","hs256");
        Map<String, Object> claims=new HashMap<>();
        claims.put("username",username);
        String token=builder.withHeader(headers)
                .withClaim("user",claims)
                .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))//设置失效日期,12小时后过期
                .sign(Algorithm.HMAC256(key));//加密时所用的密钥
        return token;
    }
    public static boolean parseToken(String token){
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(key))//算法HMAC256要与上面的相同,mykey也要一样
                .build();
        try{
            DecodedJWT decodedJWT = verifier.verify(token);//验证token
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
}

用户接口中生成令牌

@RestController
@RequestMapping("/user")
public class UserController {
   

    @PostMapping("/login")
    public Result login(String username,String password){
        //参数校验
        //校验用户名和密码是否为5~16字符串
        if(username!=null &&StringUtils.hasLength(username) && username.length()>=5 && username.length()<=16
                && password!=null &&StringUtils.hasLength(password) && password.length()>=5 && password.length()<=16){
            //验证用户名是否存在
            //验证密码是否正确
            if("******".equals(username) && "******".equals(password)){
                //生成token
                String token = JwtUtil.genToken(username);
                return Result.success(token);
            }else{
                return Result.error("用户名或密码错误");
            }
        }else{
            return Result.error("用户名或密码长度必须在5~16范围内");
        }
    }
}

拦截器中验证令牌


@Component//拦截器放入容器中,方便WebMvcConfig注入
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        //判断请求头是否携带了token
        String token = request.getHeader("Authorization");
        if (token==null){
            //没有携带则拦截,并设置http状态码为401
            response.setStatus(401);
            return false;
        }else{
            //携带了令牌
            //验证令牌
            boolean isPass = JwtUtil.parseToken(token);
            if(isPass){
                //验证通过则放行
                return true;
            }else{
                //验证不通过也拦截
                response.setStatus(401);
                return false;
            }
        }
    }
}

注册拦截器,配置拦截哪些请求,不拦截哪些请求



@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .excludePathPatterns("/user/login","/user/register");//放行登录和注册请求
    }
}

文章接口


@RestController
@RequestMapping("/article")
public class ArticleController {
    @GetMapping("/list")
    public Result list(){
        return Result.success("所有文章列表");
    }
}

测试:使用postman请求文章接口
在这里插入图片描述
为postman的collection设置统一header
在这里插入图片描述

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

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

相关文章

uniapp重新编译在微信开发者工具跳转指定页面

uniapp重新编译在微信开发者工具跳转指定页面 步骤 选择编译模式添加编译模式设置启动页面

rk3588调用NPU、查看npu的使用情况

1、rk3588启用NPU 启用三个内核->RKNNLite.NPU_CORE_0_1_2 rknn_lite RKNNLite(verboseFalse) ret rknn_lite.load_rknn(RKNN_MODEL) ret rknn_lite.init_runtime(core_maskRKNNLite.NPU_CORE_0_1_2) 2、查看NPU使用情况&#xff1a; watch sudo cat /sys/kernel/deb…

LaViT:Less-Attention Vision Transformer的特性与优点

引言 https://arxiv.org/pdf/2406.00427 随着计算机视觉领域的发展&#xff0c;视觉Transformer&#xff08;ViTs&#xff09;逐渐成为一项重要技术。尽管ViTs在捕捉图像中的长距离依赖关系方面表现出色&#xff0c;但其沉重的计算负担和潜在的注意力饱和问题一直是实际应用的…

利用Python对Excel数据进行条件筛选与排序

目录 一、Python与Excel数据处理的基础知识 1.1 Python中的Excel数据处理库 1.2 pandas库简介 二、使用pandas读取Excel数据 三、Excel数据的条件筛选 3.1 单条件筛选 3.2 多条件筛选 3.3 使用query方法 四、Excel数据的排序 4.1 单列排序 4.2 多列排序 五、案例分…

Python自动化:Excel根据IP匹配网段获取所属源端口

需求 现在有两个文件&#xff1a; 1. 【NTP.xlsx】&#xff1a;有name、IP、fenzhihang、vendor、source这五列 2. 【IP.xlsx】&#xff1a;有daqu、fenzhihang、duankou、IP、mask、gateway、subnet、yongtu、miaoshu这九列 现在更新基线&#xff0c;每台设备都需要增加nt…

ET6框架(二)Demo工程的运行及编译

1.工程下载地下&#xff1a; GitHub - egametang/ET at release6.0 2.复制地址后下载&#xff0c;在本人使用时ET已更新到最新9.0的版本&#xff0c;因此下载后需要切换分支到6.0版本 3.下载完工程后可以用 UnityHub打开工程&#xff0c;如没有对应版本可以在&#xff1a;h…

OpenHarmony技术开发:Launcher架构应用启动流程分析

简介 Launcher 作为系统人机交互的首要入口&#xff0c;提供应用图标的显示、点击启动、卸载应用&#xff0c;并提供桌面布局设置以及最近任务管理等功能。 Launcher 采用 扩展的 TS 语言&#xff08;eTS&#xff09;开发&#xff0c;主要的结构如下&#xff1a; product 业务…

安卓13 背光调节非线性问题处理,调节范围不正常问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码修改 4.彩蛋 1.前言 我们看看现在的版本的亮度图 2.问题分析 当背光亮度设置为0%时,每次按下亮度增加键或者 input keyevent BRIGHTNESS_UP,亮度UI的增幅较大,首次按下后亮度平滑提升至大约55%,随后继…

路旁树木种类巡检检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

路旁树木种类巡检检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着城市化进程的加快&#xff0c;城市绿化…

七、面向对象编程(中级)

文章目录 一、IDEA1.1 IDEA下载安装1.2 IDEA的使用1.3 IDEA常用的快捷键 二、包2.1 包的基本介绍2.2 包的本质分析2.3 包的命名2.4 常用的包2.5 如何引入包 三、访问修饰符四、面向对象的三大特征4.1 封装4.2 继承4.2.1 为什么需要继承4.2.2 继承的基本介绍4.2.3 继承的深入讨论…

【C++题解】1222. 经典递归问题——汉诺塔

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1222. 经典递归问题——汉诺塔 类型&#xff1a;递归、函数 题目描述&#xff1a; 汉诺塔&#xff08;又称河内塔&#xff09;问题是印度的一个古老的传说。开天辟地的神勃拉玛在一…

关于武汉芯景科技有限公司的MCU监控芯片XJ809S开发指南(兼容MAX809S)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、功能 当电源电压低于预设阈值时&#xff0c;芯片会发出复位信号&#xff0c;将微处理器或系统重置到初始状态&#xff0c;防止因电源问题导致的系统错误运行。复位信号在电源电压恢复并稳定后至少保持140ms&#xff0c;确保系统有…

HikariCP源码分析之源码环境搭建

一、fork源码库 为了方便记录以及查看一些历史的提交信息&#xff0c;我先在github上fork了这个源码库。 他的原始源码库位置为HikariCP源码位置 在fork到我的源码库之后&#xff0c;我就可以用git clone拉取下来&#xff0c;然后在我本地打开&#xff0c;做一些修改和笔记。然…

点云上采样

【版权声明】本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 参考书籍&#xff1a;《人工智能点云处理及深度学习算法》 本文为专栏《Python三维点云实战宝典》系列文章&#xff0c;专栏介绍地址“【python三维深度学习】python…

mysql regexp匹配多个字符串

项目场景&#xff1a; 数据结构 其中nameArr存储的是名字集合&#xff0c;现在的需求是传入"aaa","fff"&#xff0c;需要把包含这两个name的数据都查出来。 解决方案&#xff1a; 可以使用REGEXP来匹配包含多个特定ID的字符串。使用以下正则表达式&#x…

Linux1-初识Linux

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、硬件和软件 我们所熟知的计算机是由&#xff1a;硬件和软件所组成。 硬件&#xff1a;计算机系统中由电子&#xff0c;机械和光电元件等组成的各种物理装置的总称。 软件&#xff1a;是用户和…

复习Vue笔记(给自己做笔记)

基于脚手架创建前端工程 环境要求 node.js&#xff1a;前端项目的运行环境&#xff08;相当于Java的运行环境JDK&#xff09; npm&#xff1a;JS的包管理工具/器 Vue CLI&#xff1a;基于Vue进行快速开发的完整系统&#xff0c;实现交互式的项目脚手架 创建Vue基础项目代码&a…

从入门到专业,2024年精选录屏工具一网打尽

电脑录屏随着科技的飞速发展和数字化生活的普及已经成为了我们学习、日常工作、娱乐中不可或缺的一部分。本文将带你一起探索和班迪录屏一样大火的电脑录屏工具有哪些。 1.福昕REC大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这款软件体积小巧精致&#xff0c;不需要多…

【第81课】开发框架安全SpringBootStruts2LaravelThinkPHPCVE复现

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0…

Golang | Leetcode Golang题解之第376摆动序列

题目&#xff1a; 题解&#xff1a; int wiggleMaxLength(int* nums, int numsSize) {if (numsSize < 2) {return numsSize;}int prevdiff nums[1] - nums[0];int ret prevdiff ! 0 ? 2 : 1;for (int i 2; i < numsSize; i) {int diff nums[i] - nums[i - 1];if ((…