• OJ项目——使用JWT生成Token


    目录

    前言

    1、项目中需要修改哪些东西?

    1.1、引入依赖

    1.2、编写JWT工具类

    1.3、登陆成功后,把以前的session修改为token

    1.4、登录拦截器的修改

    1.5、展示前端部分代码


    前言

            有兴趣的小伙伴,可以先看看这篇文章,如果使用session,我们在项目中是如何做的:http://t.csdnimg.cn/7hFju 

            关于session、token以及Token生成的详解在:http://t.csdnimg.cn/VSn98 ,不了解JWT的伙伴,也可以看看这个篇文章;这篇文章中,介绍的比较详细,有兴趣伙伴可以看看。下面这篇文章我就直接介绍,在我的OJ项目如果使用JWT生成token~

            我的项目在之前是使用session的,所以我们在session的基础之上进行修改就可以了~

    1、项目中需要修改哪些东西?

            首先呢?使用session时在后端,我们只有三个地方使用到了session,第一个就是用户在进行登录时,获取到session,给session的Attribute属性添加一个键值对,这个键值对的值就是存储用户信息;第二个就是在实现登录拦截时验证用户信息,需要得到session后,获取Attribute中指定的的键值对中的值是否有值,有值则表示用户已登录,无则表示用户未登录;第三个就是在后续想要通过请求中的session来获取用户某些信息时,如通过请求中的session获取用户的id时,我们需要通过请求获取到session,通过session的Attribute中指定的键值对,拿到这个键值对中的值,这个值中就会存有这个用户的部分信息~

            综上,我们在将session修改为Token时,也是需要修改这几步~

    1.1、引入依赖

    引入jwt依赖:

    1. <!-- jwt依赖 -->
    2. <dependency>
    3. <groupId>io.jsonwebtoken</groupId>
    4. <artifactId>jjwt</artifactId>
    5. <version>0.9.1</version>
    6. </dependency>

    1.2、编写JWT工具类

    1. package com.example.demo.commom;
    2. import io.jsonwebtoken.*;
    3. import org.springframework.util.StringUtils;
    4. import javax.servlet.http.HttpServletRequest;
    5. import java.util.Date;
    6. /**
    7. * Created with IntelliJ IDEA.
    8. * Description:
    9. * User:龙宝
    10. * Date:2023-11-07
    11. * Time:9:23
    12. */
    13. public class JWTUtils {
    14. private static final long EXPIERS = 1000 * 60 * 60 * 24; //设置为一天
    15. private static final String SECRET = "xiaolong";//设置密钥,每个公司都不一样~
    16. /**
    17. * 使用JWT生成token
    18. * @param id
    19. * @param username
    20. * @return
    21. */
    22. public static String getTWTToken(Integer id,String username) {
    23. String JWTToken = Jwts.builder()
    24. //JWT头
    25. .setHeaderParam("typ","JWT")
    26. .setHeaderParam("alg","HS256")
    27. //JWT主体
    28. //这三个为可选
    29. .setSubject("guli-user") //主题
    30. .setIssuedAt(new Date()) //创建时间
    31. .setExpiration(new Date(System.currentTimeMillis() + EXPIERS)) // 过期时间
    32. //主题中存储用户信息的部分
    33. .claim("id",id)
    34. .claim("username",username)
    35. //设置签名哈希,防伪标志
    36. .signWith(SignatureAlgorithm.HS256,SECRET)
    37. .compact();
    38. return JWTToken;
    39. }
    40. /**
    41. * 验证token是否存在 + 有效
    42. * @param JWTToken
    43. * @return
    44. */
    45. public static boolean checkToken(String JWTToken) {
    46. if(!StringUtils.hasLength(JWTToken)) {
    47. return false;
    48. }
    49. try{
    50. Jwts.parser().setSigningKey(SECRET).parseClaimsJws(JWTToken);
    51. } catch (Exception e) {
    52. e.printStackTrace();
    53. return false;
    54. }
    55. return true;
    56. }
    57. /**
    58. * 验证token是否存在 + 有效
    59. * @param request
    60. * @return
    61. */
    62. public static boolean checkToken(HttpServletRequest request) {
    63. try {
    64. String token = request.getHeader("token");
    65. if(!StringUtils.hasLength(token)) {
    66. return false;
    67. }
    68. Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
    69. } catch (Exception e) {
    70. e.printStackTrace();
    71. return false;
    72. }
    73. return true;
    74. }
    75. /**
    76. * 根据token获取id
    77. * @param request
    78. * @return
    79. */
    80. public static Integer getMemberIdByJwtToekn(HttpServletRequest request) {
    81. String token = request.getHeader("Authorization");
    82. if(!StringUtils.hasLength(token)) {
    83. return new Integer("");
    84. }
    85. //解析token
    86. Jwt claimsJwt = Jwts.parser().setSigningKey(SECRET).parseClaimsJwt(token);
    87. //获取载荷中的有效信息【用户信息】
    88. Claims claims = claimsJwt.getBody();
    89. return new Integer(claims.getId());
    90. }
    91. }

    1.3、登陆成功后,把以前的session修改为token

     

    1.4、登录拦截器的修改

    说明:

    • 代码理解:通过请求头获取key---Authorizatio所对应的value的值,这个value就是Token,我们拿着这个Token字符串去验证就可以了。【请求头中的是按照Authorizatio:token 这样的格式来的,大家也可以按照自己的设计走】

    1.5、展示前端部分代码

    登陆成功后,设置token:

    我们可以把他设置在cookie中,也可以设置在localStorage中~

    在发送请求时,请求头需要代码Token:

    或者,给所有的ajax请求都添加上:

    下面的这个代码,需要放在js代码的最前面~ 公共js代码的话,记得引入js~

     当然了,如果小伙伴学习过vue的话,使用vue会更加简单~

    好啦,本期就到这里啦~下期见哦~

  • 相关阅读:
    LeetCode:1337. 矩阵战斗力最弱的 K 行、11. 盛最多水的容器、剑指 Offer 51. 数组中的逆序对题解
    leetcode: 529. 扫雷游戏
    [Mac软件]Leech for Mac v3.2 - 轻量级mac下载工具
    Jetson Nano2GB(TX2\NX\XAVIER)使用ffmpeg进行硬解码配置笔记
    增量学习 Demo
    2024.7.13刷题记录-牛客小白月赛98(未完)
    哪些电商平台的 API 很好用?为什么?
    分布式事务,单JVM进程与多数据库,分布式事务技术选型,0-1过程,代码全。
    PyCharm 中使用文件监视器自动处理 Python 文件
    春招面试准备笔记——NMS(非极大值抑制)算法
  • 原文地址:https://blog.csdn.net/LYJbao/article/details/134230067