JWT

登录使用JWT技术。

JWT 可以生成 一个加密的 token,做为用户登录的令牌,当用户登录成功之后,发放给客户端。

请求需要登录的资源或者接口的时候,将token携带,后端验证token是否合法。

JWT 有三部分组成:A.B.C

  • A:Header,{“type”:“JWT”,“alg”:“HS256”} 固定

  • B:playload,存放信息,比如,用户id,过期时间等等,可以被解密,不能存放敏感信息

  • C: 签证,A和B加上秘钥 加密而成,只要秘钥不丢失,可以认为是安全的。

JWT验证,主要就是验证C部分 是否合法。

依赖包

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

创建工具类

package top.lingchen.blogapi.utils;import io.jsonwebtoken.Jwt;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** @Author 凌宸* @create 2021-12-16 下午 4:57* @Description* @Version 1.0*/
public class JWTUtils {private static final String jwtToken = "@lingchen1120.com!@#$$"; // 密钥public static String createToken(Long userId){Map<String,Object> claims = new HashMap<>();claims.put("userId",userId);JwtBuilder jwtBuilder = Jwts.builder().signWith(SignatureAlgorithm.HS256, jwtToken) // 签发算法,秘钥为jwtToken.setClaims(claims) // body数据,要唯一,自行设置.setIssuedAt(new Date()) // 设置签发时间,     // 一天的有效时间.setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 60 * 1000));String token = jwtBuilder.compact();return token;}public static Map<String, Object> checkToken(String token){try {Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);return (Map<String, Object>) parse.getBody();}catch (Exception e){e.printStackTrace();}return null;}public static void main(String[] args) {// 在这可以测试查看生成的 token}
}

配合之前的 Redis 缓存使用,将令牌 token 存入 Redis。

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableLogic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import top.lingchen.blogapi.bean.SysUser;
import top.lingchen.blogapi.service.LoginService;
import top.lingchen.blogapi.service.SysUserService;
import static top.lingchen.blogapi.vo.ErrorCode.*;import top.lingchen.blogapi.utils.JWTUtils;
import top.lingchen.blogapi.vo.Result;
import top.lingchen.blogapi.vo.params.LoginParam;import java.util.Map;
import java.util.concurrent.TimeUnit;/*** @Author 凌宸* @create 2021-12-16 下午 5:05* @Description* @Version 1.0*/
@Service
@Transactional
public class LoginServiceImpl implements LoginService {@Autowiredprivate SysUserService sysUserService;@Autowiredprivate StringRedisTemplate stringRedisTemplate;// 加密盐private static final String slat = "@1642.lingchen!@#";@Overridepublic Result login(LoginParam loginParam) {/*** 1.检查参数是否合法* 2. 根据用户名和密码去 user 表中查询记录是否存在* 3.如果不存在,登录失败* 4.如果存在,使用 JWT 生成 token 返回给前端* 5. 将 token 放入 redis 中, redis token:user 信息,设置过期时间* (登录验证时,先验证 token 字符串是否合法, 去 redis 认证是否存在)*/String account = loginParam.getAccount();String password = loginParam.getPassword();if(!StringUtils.hasLength(account) || !StringUtils.hasLength(password)){return Result.fail(PARAMS_ERROR.getCode(), PARAMS_ERROR.getMsg());}password = DigestUtils.md5Hex(password + slat);SysUser sysUser = sysUserService.findUser(account, password);if(sysUser == null){return Result.fail(ACCOUNT_PWD_NOT_EXIST.getCode(), ACCOUNT_PWD_NOT_EXIST.getMsg());}// 根据登录用户的 id 生成 token,并存入 redis 服务器String token = JWTUtils.createToken(sysUser.getId());stringRedisTemplate.opsForValue().set("TOKEN_" + token, JSON.toJSONString(sysUser), 1, TimeUnit.DAYS);return Result.success(token);}
}

登录功能使用 JWT 技术相关推荐

  1. IM的扫码登录功能如何实现?一文搞懂主流的扫码登录技术原理

    本文引用了3位作者"精品唯居"."  Yangfan2016"." MrYun"的部分文章内容,一并感谢. 1.引言 扫码登录这个功能,最早 ...

  2. 【struts2+hibernate+spring项目实战】实现用户登录功能(ssh)

    一.概述 从今天才开始有时间来总结总结以前自己练习的一些东西,希望总结出来对以后可以更加便捷的来学习,也希望可以帮助到正需要这些东西的同行人,一起学习,共同进步. 二. 登录功能总结 2.1.登录功能 ...

  3. H5 微信授权登录功能实现

    背景 最近几周面试复习以前知识库,刚好博客从国外迁移到国内CSND,同步坐下笔记,梳理之前开发H5 微信授权登录功能获取用户信息数据. H5页面微信授权登录,使用微信官方JSSDK,微信网页授权较为复 ...

  4. JSON Web Token (JWT)笔记(token实现单点登录功能)

    文章目录 前情提要 cookie(储存在用户本地终端上的数据) Cookie特点: session(web服务端内存) cookie和session 单点登录(只登录一次,可使用账号下全部服务)三种方 ...

  5. 【学习日记2023.5.8】之 springboot案例之登录功能(会话技术_JWT令牌_过滤器_拦截器)

    文章目录 1. 案例-登录认证 1. 1登录功能 1.1.1 需求 1.1.2 接口文档 1.1.3 思路分析 1.1.4 功能开发 1.1.5 测试 1.1.6 全后端联调 1.2 登录校验 1.2 ...

  6. 使用jwt技术实现系统间的单点登录

    单点登录(single sign on),简称sso.它的定义是多个应用系统间,只需要登录一次就可以访问所有相互信任的应用系统.下面介绍用jwt技术如何来实现单点登录. 一.JWT定义及其组成 JWT ...

  7. 微信小程序一键登录功能,使用uni-app和springboot(JWT鉴权)

    目录 概述 微信登录接口说明 关于获取微信用户的信息 前端代码(uni-app) 后端代码(SpringBoot) 配置文件:application.yml 配置文件:Pom.xml 类:WeChat ...

  8. IM要做手机扫码登录?先看看微信的扫码登录功能技术原理

    本文原文由作者Amazing10原创发布于公众号业余码农,收录时有改动,感谢原作者的技术分享. 1.引言 某天中午,吃完午饭,摊在自己的躺椅上,想趁吃饱喝足的午后时间静静享受独自的静谧. 干点什么好呢 ...

  9. IM扫码登录技术专题(三):通俗易懂,IM扫码登录功能详细原理一篇就够

    本文引用了作者"大古同学"的"二维码扫码登录是什么原理"一文的主要内容,为了更好的理解和阅读,即时通讯网收录时有修订和改动,感谢原作者的分享. 1.引言 自从微 ...

  10. day07-vue项目-搭建项目到登录功能

    文章目录 1.电商业务概述 2.项目初始化 3.码云相关操作 B.安装git D.在本地创建公钥:在终端运行:ssh-keygen -t rsa -C "xxx@xxx.com" ...

最新文章

  1. 在Ubuntu 16.04.5 LTS上使用python第三方库QRCode 6.0生成二维码实录
  2. 并发编程之多线程篇之四
  3. SQL注入手工注入常用的语句
  4. mysql 慢日志报警_一则MySQL慢日志监控误报的问题分析
  5. Java连载3-编译与运行阶段详解JRE,JDK,JVM关系
  6. 1.4 满足和优化指标
  7. mysql8.0.12怎么配置_MySQL8.0.12安装及配置
  8. 云计算机工作组,边缘云场景、需求与组网架构
  9. 【转】Google Chrome中顺时针/逆时针滚动圆的含义
  10. 集成建行聚合支付踩过的坑,有些槽不吐不快
  11. Vmware虚拟机和主机之间复制、粘贴内容、拖拽文件的详细方法
  12. 前端常用的八种数据结构
  13. 培训班作业---作业1:公羊母羊生小羊的问题
  14. 带你了解计算机网络的背景和框架
  15. 六度分离 (Floyd算法)
  16. 工业蒸汽_到底什么是蒸汽机,我想要一个吗?
  17. 在VS中如何设置自动换行
  18. 全开源免费的客服系统来了
  19. 共筑未来 | 思腾合力加入光合组织,完成国产信创兼容适配
  20. springboot连接数据库用户名密码加密

热门文章

  1. latex入门(五) 插入表格
  2. 正确的握笔姿势,握笔的姿势非常的重要
  3. c语言输出最大的数ns流程图_急!!!!c语言NS流程图
  4. mac忘记mysql初始密码怎么办_Mac下忘记Mysql密码重新设置密码的图文教程
  5. java redis scan6_Redis中scan命令的深入讲解
  6. 前有狗屁不通文章生成器 | 后有申论生成器
  7. 实现 Excel 多列数据组合
  8. 转载一篇心灵鸡汤,致在路上奋斗的ACMer
  9. ios 旋转屏幕试图切换_iOS播放器横竖屏切换的实现
  10. 电脑小白须知!N卡和A卡有什么区别?A卡和N卡的区别,一个动图秒懂!