JWT令牌技术实现登录校验

一.简单登录功能

在登录界面中,我们可以输入用户的用户名以及密码,然后点击 "登录" 按钮就要请求服务器,服务端判断用户输入的用户名或者密码是否正确。如果正确,则返回成功结果,跳转至系统首页面。

1.功能开发

1.分析

登录的逻辑就是:接收前端请求传递的用户名和密码 ,然后再根据用户名和密码查询用户信息,如果用户信息存在,则说明用户输入的用户名和密码正确。如果查询到的用户不存在,则说明用户输入的用户名和密码错误。

2.实现

controller层

获取请求 用户名密码使用Emp对象获取

@RequestBody注解

返回响应 查询有结果success 否则false

@RestController
public class LoginController {@Autowiredprivate EmpService empService;@PostMapping("/login")public Result login(@RequestBody Emp emp){Emp e = empService.login(emp);return  e != null ? Result.success():Result.error("用户名或密码错误");}
}

service层

调用mapper层

public interface EmpService {/*** 用户登录* @param emp* @return*/public Emp login(Emp emp);//省略其他代码...
}
EmpServiceImpl
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic Emp login(Emp emp) {//调用dao层功能:登录Emp loginEmp = empMapper.getByUsernameAndPassword(emp);//返回查询结果给Controllerreturn loginEmp;}   //省略其他代码...
}

 mapper层

查询数据 返回结果

EmpMapper
@Mapper
public interface EmpMapper {@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time " +"from emp " +"where username=#{username} and password =#{password}")public Emp getByUsernameAndPassword(Emp emp);//省略
}

 3.测试

功能开发完毕后,我们就可以启动服务,打开postman进行测试

 二. 登录校验功能

登录校验,指的是我们在服务器端接收到浏览器发送过来的请求之后,首先我们要对请求进行校验。先要校验一下用户登录了没有,如果用户已经登录了,就直接执行对应的业务操作就可以了;如果用户没有登录,此时就不允许他执行相关的业务操作,直接给前端响应一个错误的结果
需要使用到会话跟踪技术

1.会话技术

 在web开发当中,会话指的就是浏览器与服务器之间的一次连接,我们就称为一次会话。

在用户打开浏览器第一次访问服务器的时候,这个会话就建立了,直到有任何一方断开连接,此时会话就结束了。在一次会话当中,是可以包含多次请求和响应的。
比如登录一个系统,访问查询员工,修改员工 这两次请求都属于同一次会话

2.会话跟踪

服务器需要识别多次请求是否来自于同一浏览器

服务器会接收很多的请求,但是服务器是需要识别出这些请求是不是同一个浏览器发出来的。比如:1和2这两个请求是不是同一个浏览器发出来的,3和4这两个请求不是同一个浏览器发出来的。如果是同一个浏览器发出来的,就说明是同一个会话。如果是不同的浏览器发出来的,就说明是不同的会话。

使用会话跟踪技术就是要完成在同一个会话中,多个请求之间进行共享数据。

 为什么要共享数据呢?

 由于HTTP是无状态协议,在后面请求不能拿到前一次请求生成的数据,此时就需要在一次会话的多次请求之间进行数据共享

会话跟踪技术有3种:

1. Cookie(客户端会话跟踪技术)
   - 数据存储在客户端浏览器当中
2. Session(服务端会话跟踪技术)
   - 数据存储在储在服务端
3. 令牌技术

这里举例最常用令牌技术

三.令牌技术

1.令牌技术

客户端登录成功后,服务器生成JWT令牌 分发给客户端,客户端每次请求携带该令牌,每次服务器统一校验

2.Jwt令牌组成

本质就是一个字符串。

3个部分

- 标头(Header)
- 有效载荷(Payload)
- 签名(Signature)
- 因此,JWT通常如下所示: xxxx.yyyyy.zzzzz   Header.Payload.Signature


 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}

第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}

第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

3.JWT生成和校验

首先我们先来实现JWT令牌的生成。要想使用JWT令牌,需要先引入JWT的依赖:

<!-- JWT依赖-->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

 在引入完JWT来赖后,就可以调用工具包中提供的API来完成JWT令牌的生成和校验
 工具类:Jwts

生成JWT

//生成JWT令牌public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey)//签名算法.setExpiration(new Date(System.currentTimeMillis() + expire))//设置有效期.compact();return jwt;}

解析JWT

//    解析JWT令牌public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt)//解析jwt内容.getBody();//自定义内容return claims;}

完整工具类

package it.com.springbootmybatisprimary.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;public class JwtUtils {private static String signKey = "itheima";private static Long expire = 43200000L;//生成JWT令牌public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey)//签名算法.setExpiration(new Date(System.currentTimeMillis() + expire))//设置有效期.compact();return jwt;}//    解析JWT令牌public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt)//解析jwt内容.getBody();//自定义内容return claims;}
}

四.JWT与登录功能整合

在LoginController  检测到登录操作,如果返回Emp对象,表示用户名密码存在,登录成功,下发令牌,否则登录失败返回error

@Slf4j
@RestController
public class LoginController {@Autowiredprivate empService empservice;@PostMapping("/login")public Result login(@RequestBody Emp emp){log.info("获取参数{}",emp);Emp e= empservice.login(emp);if(e!=null){//生成并下发令牌Map<String,Object> map=new HashMap<>();map.put("用户名",e.getName());map.put("用户id",e.getId());String jwt= JwtUtils.generateJwt(map);return Result.success(jwt);}
return Result.error("用户名或密码错误");}
}

postman测试

登录成功返回jwt令牌 登录失败返回错误信息

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

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

相关文章

[笔试训练](二十二)064:添加字符065:数组变换066:装箱问题

目录 064:添加字符 065:数组变换 066:装箱问题 064:添加字符 添加字符_牛客笔试题_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 枚举所有A&#xff0c;B字符串可能的对应位置&#xff0c;得出对应位置不同字符数量的最小情况 两字符串的字符数量差n-m&…

springboot月度员工绩效考核管理系统

摘要 本月度员工绩效考核管理系统采用java语言做为代码编写工具&#xff0c;采用mysql数据库进行系统中信息的存储与处理。框架采用springboot。 本系统的功能分为管理员和员工两个角色&#xff0c;管理员的功能有&#xff1a; &#xff08;1&#xff09;个人中心管理功能&am…

“Linux”目录结构and配置网络

了解完命令格式和vi、vim编辑器后&#xff0c;我们来认识一下目录的结构&#xff1a; 一、目录 &#xff08;1&#xff09;目录的特点 windows特点&#xff1a; Windows中有C、D、E盘&#xff0c;每个都是一个根系统 Linux特点&#xff1a; linux中只有一个根&#xff08;单…

冯喜运:5.14黄金大幅度修正?原油价格下跌成拖累?

【黄金消息面分析】&#xff1a;本周重要的美国数据的发布可能会对美元以及黄金产生重大影响。周四将公布更多经济指标&#xff0c;包括新屋开工和许可证、费城联储指数、工业生产数据和每周初请失业金人数。对于黄金而言&#xff0c;人们的注意力集中在经济和劳动力市场疲软对…

DRF 纯净版创建使用

【一】介绍 &#xff08;1&#xff09;使用原因 在Django中&#xff0c;contrib 包包含了许多内置的app和中间件&#xff0c;如auth、sessions、admin等&#xff0c;这些app在创建新的Django项目时默认是包含在内的。然而&#xff0c;在开发RESTful API时&#xff0c;可能不需…

jenkis

文章目录 安装插件配置构建超时自动停止 安装插件 在线安装&#xff1a;安装jenkins后&#xff0c;初次启动的时候安装插件 在线安装&#xff1a;插件管理&#xff0c;可选插件中 离线安装&#xff1a;下载插件(.hpi格式) 使用该方法安装插件每次只能安装一个插件&#xff0c;…

基于RTL8710BN与天猫精灵的WIFI智能家居方案

0 项目简介 目的&#xff1a; 语音控制智能家居产品 基于阿里云的物联网产品 基于WiFi技术的嵌入式产品 主要技术&#xff1a; WiFi技术 常用的物联网协议 网络编程 云平台配置 MCU OPENSDK开发 阿里物联网操作系统 硬件&#xff1a; wifi开发板RTL8710BN 天猫精灵…

大数据可视化实验(五):Tableau数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;打开数据源... 1 2&#xff09;进入工作簿... 2 3&#xff09;字段设置... 2 4&#xff09;数据筛选... 3 5&#xff09;绘制条形图... 3 四、思考问题... 4 五、总结与心得体会... 4 一、…

5月14(信息差)

&#x1f30d;字节携港大南大升级 LLaVA-NeXT&#xff1a;借 LLaMA-3 和 Qwen-1.5 脱胎换骨&#xff0c;轻松追平 GPT-4V Demo 链接&#xff1a;https://llava-next.lmms-lab.com/ &#x1f384;阿里巴巴开源的15个顶级Java项目 ✨ 欧洲在线订餐服务Takeaway.com&#xff1a…

JavaScript中带日期的操作

当我们把日期转换为Number类型的时候&#xff0c;就会变成时间戳&#xff08;毫秒&#xff09; const future new Date(2037, 10, 19, 15, 23); console.log(Number(future)); // console.log(future); //与上行代码等效● 所以我们就可以利用时间戳去做点东西&#xff0c;例…

GPT-4o:融合文本、音频和图像的全方位人机交互体验

引言&#xff1a; GPT-4o&#xff08;“o”代表“omni”&#xff09;的问世标志着人机交互领域的一次重要突破。它不仅接受文本、音频和图像的任意组合作为输入&#xff0c;还能生成文本、音频和图像输出的任意组合。这一全新的模型不仅在响应速度上达到了惊人的水平&#xff0…

qt cmake加入程序exe图标

可以看到qt自动编译出来的图标是默认的&#xff0c;如下图所示 我想要更改成自定义的图标&#xff0c;比如下方的样子 下边是操作步骤&#xff1a; 图标选择与转化成ico 通过这个网站将正常图片转化成ico&#xff1a;https://www.bitbug.net/创建rc文件 将ico复制到cmakelis…

短视频拍摄+直播间搭建视觉艺术实战课:手把手场景演绎 从0-1短视频-8节课

抖音短视频和直播间你是否遇到这些问题? 短视频是用手机拍还是相机拍?画面怎么拍都没有质感 短视频产量低&#xff0c;拍的素材可用率低 看到别人用手机就能把短视频拍好自己却无从下手 明明已经打了好几盏灯了,但是画面还是比较暗 直播软件参数不会设置&#xff0c;电脑…

纯电动汽车的发展趋势简述

纯电车简介 纯电动汽车是使用电池驱动电动马达而不是传统的内燃机的汽车。它们通常使用电池组储存能量&#xff0c;然后通过电动马达转化为动力来驱动车辆。相比于传统的燃油车&#xff0c;纯电动汽车具有零排放、低噪音、低维护成本等优点&#xff0c;因此在环保和能源效率方…

数据新探:用Python挖掘互联网的隐藏宝藏

Hello&#xff0c;我是你们的阿佑&#xff0c;今天给大家上的菜是——数据存储&#xff01;听起来枯燥无味&#xff1f;错了&#xff01;阿佑将带你重新认识数据存储的艺术。就像为珍贵的艺术品寻找完美的展览馆&#xff0c;为你的数据选择合适的存储方式同样重要&#xff01; …

版本控制:软件开发的基石(一文读懂版本控制)

未经允许&#xff0c;禁止转载&#xff01; 在现代软件开发中&#xff0c;版本控制是不可或缺的工具。它帮助开发者跟踪和管理代码的变化&#xff0c;协作完成项目&#xff0c;并确保代码的完整性和安全性。本文将基于Git官网的视频“什么是版本控制”来深入探讨版本控制的基本…

Linux实验 vi编辑器的使用与磁盘管理

实验目的&#xff1a; 掌握vi编辑器的启动、保存和退出&#xff1b;掌握vi编辑器的三种工作模式的转换及输入模式下的操作&#xff1b;了解Linux文件系统类型、虚拟文件系统和存储设备的名称&#xff1b;掌握磁盘文件系统的挂载和卸载&#xff1b;掌握常用磁盘操作命令&#x…

C. Sort Zero

题目描述 思路分析: 记住他是要保证这个数列是不降的,也就是说如果某一个位置上的数变成了0,那么这个数前面的部分一定全都是0了,我们用map数组得到每一个数出现的最晚的位置,先从后向前遍历一遍,找出从哪开始出现了递减,然后标记下来结束即可,看看前面的每一个数都要用st标记是…

关于nvm管理node版本的一些问题

背景&#xff1a; 基于开发项目的迭代不能做到全部更新&#xff0c;有的项目是vue2.0 有的项目是vue3.0&#xff0c; 那么我们开发的时候就需要对node 进行更新&#xff0c;进而产生因为版本不同导致的错误&#xff1a;由此我们需要一款管理 切换node版本的东西&#xff0c;那就…

C语言 8 函数递归

目录 1. 递归是什么&#xff1f; 2.递归的限制条件 3. 递归举例1 4. 递归举例2 5.迭代 6. 递归举例3 拓展学习&#xff1a; 1. 递归是什么&#xff1f; 递归是学习C语⾔函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xff1f; 递归其实是⼀种解决问题的⽅法&#xff0c…