SpringBoot学习笔记(16)-整合JWT做身份验证

Util工具类(JwtUtil、MD5Util、ThreadLocalUtil、拦截器配置) 【代码】Util工具类(JwtUtil、MD5Util、ThreadLocalUtil、拦截器配置、全局异常处理器) 阅读详情


本文主要参考了以下两篇文章,如果对JWT不熟悉则可以进去了解:

  • http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
  • https://blog.youkuaiyun.com/qq_37636695/article/details/79265711

JWT的作用时序图:

在这里插入图片描述

一、导入JWT依赖

SpringBoot在使用JWT前需要导入jjwt依赖:

  • pom.xml
<!-- jjwt -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

二、JWTUtil

这是为JWT写的工具类,用来生成JWT以及解析JWT,具体的作用都在代码中有注释。

  • JWTUtil
/**
 * @Author: arong
 * @Description: JWT工具
 * @Date: 2019/1/19 11:05
 */
public class JWTUtils {
     //用于生成secret key的stingKey
    private static String JWT_SECRET = "asdfghjkl1234567890";

        /*
             *@author arong
             *@description 创建JWT Token
             *@param: claims jwt的所含的用于校验的信息
            *@param: subject 用户唯一标识
            *@param: ttlMillis  过期时间(毫秒)
             *@return java.lang.String
             *@date 2019/1/19
             */
      public static String createJWT(Map claims,String subject, long ttlMillis) throws Exception {
          //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
          SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
          //生成JWT的时间
            long nowMillis = System.currentTimeMillis();
            //将long型的时间毫秒转为日期时间
            Date now = new Date(nowMillis);

              //生成签名的时候使用的秘钥secret
            SecretKey key = generalKey();

            //下面就是在为payload添加各种标准声明和私有声明了
            JwtBuilder builder = Jwts.builder() //这里其实就是new一个JwtBuilder,设置jwt的body
                    .setClaims(claims) //如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
                    .setIssuedAt(now) //iat: jwt的签发时间
                    .setSubject(subject)//一个json格式的字符串作为用户的唯一标志。
                    .signWith(signatureAlgorithm, key);//设置签名使用的签名算法和签名使用的秘钥

            if (ttlMillis >= 0) {
                long expMillis = nowMillis + ttlMillis;
                Date exp = new Date(expMillis);
                builder.setExpiration(exp); //设置过期时间戳
            }

            return builder.compact();

    }

    /*
          *@author arong
          *@description 通过jwt解析得到claims数据描述对象
          *@param: jwt
          *@return io.jsonwebtoken.Claims
          *@date 2019/1/19
          */
    public static Claims parseJWT(String jwt) throws Exception{
        //得到原来的签名秘钥,用其才能解析JWT
        SecretKey key = generalKey();
        //得到 DefaultJwtParser
        Claims claims = Jwts.parser()
                .setSigningKey(key) //设置签名的秘钥
                .parseClaimsJws(jwt).getBody();//设置需要解析的jwt

        return claims;
    }


    /*
             *@author arong
             *@description
             *@param:  生成secret key
             *@return javax.crypto.SecretKey
             *@date 2019/1/19
             */
            private static  SecretKey generalKey(){
                //stringKey
                String stringKey = JWT_SECRET;
                // 使用base64解码
                byte[] encodedKey = Base64.decodeBase64(stringKey);
                // 根据给定的字节数组使用AES加密算法构造一个密钥
                SecretKey secretKey = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
                return secretKey;
            }

}

三、JWTInterceptor

这是JWT验证的拦截器类,除了登陆和注销接口不需要校验token,其他的任何接口都需要校验前端传来的token以确保请求的安全。

/**
 * @Auther: ARong
 * @Date: 2019/1/19 14:37
 * @Description: JWT token 管理后台的拦截校验器
 */
@Component
public class JWTInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 允许跨域
        response.setHeader("Access-Control-Allow-Origin", "*");
        // 允许自定义请求头token(允许head跨域)
        // response.setHeader("Access-Control-Allow-Headers", "token, Accept, Origin, X-Requested-With, Content-Type, Last-Modified");

        //后台管理页面产生的token
        String token = request.getHeader("authorization");
        //判断是否过期
        Optional.ofNullable(token)
                .map(n -> {
                    try {
                        return JWTUtils.parseJWT(n);
                    } catch (Exception e) {
                        throw new RuntimeException("token不存在");
                    }
                });
         
        return true;
    }

}

四、WebConfiguration

这个配置类用以注册JWT拦截器

/**
 * @Auther: ARong
 * @Date: 2019/1/19 15:04
 * @Description: JWT 的拦截器配置
 */
@Configuration
public class WebConfiguration implements WebMvcConfigurer{
    //spring拦截器加载在springcontentText之前,所以这里用@Bean提前加载。否则会导致过滤器中的@AutoWired注入为空
    @Bean
    JWTInterceptor jwtInterceptor(){
        return new JWTInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        System.out.println("JWT拦截器启动");
        registry.addInterceptor(jwtInterceptor())
                .excludePathPatterns("/admin/login",
                        "/api/login",
                        "/admin/logout",
                        "/error",
                        "/admin/getOnlineCount")
                .addPathPatterns();

    }
}

五、在登陆时产生token传递给前端

产生token的唯一途径是登陆,如果token过期了也只能通过重新登陆去获取token。

  • AdminController
/**
     * @param username
     * @param session
     * @auther: Arong
     * @description: 登陆 添加session
     * @return: com.iteason.anbaoli_vote_system.utils.AjaxResult
     * @date: 2019/1/16 14:03
     */
    @PostMapping(value = "/login")
    public AjaxResult login(
            @RequestParam("password") String password,
            @RequestParam("username") String username,
            HttpSession session
    ) throws Exception {
        boolean isRight = adminService.checkUsernameAndPwd(username, password);
        if (isRight) {
            //获取新token,过期时间为12h
            String token = adminService.getToken(username);     
           OnlineCount.getInstance().insertToken(token);

            Map map = new HashMap<String, Integer>();
            map.put("username", username);
            map.put("token", token);
            return new AjaxResult().ok(map);
        }
        return new AjaxResult().error("用户名或密码错误,请重新输入");
    }
  • AdminServiceImp
@Override
    public String getToken(String username) {

        //存入JWT的payload中生成token
        Map claims = new HashMap<String,Integer>();
        claims.put("admin_username",username);
        String subject = "admin";
        String token = null;
        try {
        //该token过期时间为12h
            token = JWTUtils.createJWT(claims, subject, 1000*60*60*12 );
        } catch (Exception e) {
            throw new RuntimeException("创建Token失败");
        }

        System.out.println("token:"+token);
        return token;
    }

JWT最详细教程以及整合SpringBoot的使用(简洁易上手) JWT 1、什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally sig 阅读详情

相关推荐

JJWT 依赖包完全指南-从入门到精通

在现代化的 Java 应用中,JWT(JSON Web Token)已成为身份认证和授权的主流方案。JJWT 作为 Java 生态中最受欢迎的 JWT 库,其模块化设计让开发者能够灵活选择所需功能。本指南将深入解析 JJWT 0.12.3 版本的三个核心依赖包:jjwt-api、jjwt-impl 和 jjwt-jackson,帮助您理解它们的作用、区别以及最佳使用方式。无论您是 JWT 新手还是经验丰富的开发者,都能从中获得实用的知识和技巧。

郑恩赐,厦门工学院软件工程AI方向本科在读。专注AI全栈应用开发,熟练Vue3、Spring Boot、PyTorch等技术栈,正在探索多模态大模型应用。拥有多个全栈项目和AI应用开发经验,获国家级大创立项和发明专利,掘金优质作者榜第2名。 1280

JWTUtils工具

JWT

weixin_64443786的博客 5749

SpringBoot整合Shiro与JWT的权限管理系统设计与实现

Apache Shiro 是一个强大且灵活的 Java 安全框架,广泛用于企业级应用中,提供了身份验证(Authentication)、授权(Authorization)、加密(Encryption)和会话管理(Session Management)等功能。它设计简洁,易于集成到 SpringBoot 等主流框架中。本章将系统地讲解 Shiro 的核心功能,包括其基本架构、权限控制机制、Web 应用集成方式及安全策略配置方法,帮助开发者理解 Shiro 的工作原理,并为后续集成 JWT 打下基础。

weixin_42593549的博客 976

JwtUtil工具类

import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import jav

qq_42511550的博客 3813

【翼型】基于Matlab的NACA翼型气动性能仿真与优化【附源码】

本文详细介绍了如何使用Matlab进行NACA翼型的气动性能仿真与优化。内容涵盖从生成NACA翼型坐标、利用面板法快速估算升阻力,到进阶的粘性流模拟与优化设计入门。通过清晰的代码示例和分步指南,帮助读者掌握基于Matlab的翼型分析与优化流程,为飞行器或叶片设计提供实用工具和方法。

weixin_29032489的博客 412

知识图谱的数据挖掘与分析

1. 背景介绍 1.1 数据挖掘的崛起 随着互联网的普及和大数据技术的发展,数据挖掘已经成为了计算机科学领域的热门研究方向。数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过计算机科学、统计学、信息论等多学科交叉的方法,挖掘出有用信息和知识的过程。数据挖掘的目标是从数据中发现有

AI天才研究院 1601

【SpringBoot框架篇】16.security整合jwt实现对前后端分离的项目进行权限认证

使用Spring Security+JWT实现对前后端分离的项目进行权限认证

皓亮君的博客 5659

告别手动改图!用Python+PyWin32驱动SolidWorks,实现参数自动化修改(保姆级避坑指南)

本文详细介绍了如何利用Python和PyWin32驱动SolidWorks实现参数自动化修改,提供从环境配置到API连接的工业级解决方案。通过实战案例和避坑指南,帮助工程师高效搭建自动化脚本工作流,显著提升设计效率。

weixin_30614109的博客 746

springboot整合jwt

一.JWT简介1.简介JSON Web token简称JWT, 是用于对应用程序上的用户进行身份验证的标记。也就是说, 使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性, 同时保证应用程序的安全。在身份验证过程中, 当用户使用其凭据成功登录时, 将返回 JSON...

小屁孩大帅-保密的博客 82

tecplot 通过数据点、坐标点绘制云图、三维云图

使用坐标点绘制二维云图或三维云图

medicalmask的博客 3万+

Python爬虫实战:公共资源交易平台招标数据采集实战 - 从零构建企业情报系统(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 1288

Springboot 结合JWT做用户登录验证

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.16</version> </dependency> <dependency> <g...

qq_42856647的博客 5951

docker部署neo4j,设置密码。Neo.ClientError.Security.Unauthorized: The client is unauthorized due to authenti

卷,设置NEO4J_AUTH将不会起作用,因为该数据库已经配置了身份验证。Neo4j Docker 服务将会启动,但您需要使用已与该数据库关联的用户名和密码才能登录。这里,使用了环境变量NEO4J_AUTH,设置了用户名为neo4j,密码为neo4jneo4j。这个命令还是比较全的,包括设置密码,设置端口,挂载外部的数据目录等。原因嘛,就是使用docker创建的neo4j,登录不上。把👆提到的外挂的数据,都清空了,再重新来一遍。有一种情况下,这样设置密码,并不会成功。如果不出意外,目前就算大功告成了。

xiezhipu的博客 564

使用Java实现JWT身份验证与授权

使用Java实现JWT身份验证与授权大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!JWT简介与原理JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以安全地在各方之间作为JSON对象进行传输。JWT通常用于身份验证和信息交换,由三部分组...

weixin_33865942的博客 216

innovus:InstPad、CellPad 、module padding、clock cell halo

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?site_num指的是padding的大小以site宽度为单位。

m0_61544122的博客 2028

STM32(HAL库)驱动OLED

通过STM32F103C8T6单片机采用HAL库方式对0.96寸OLED(IIC通讯)屏幕进行驱动。

weixin_44597885的博客 8806

在SpringBoot中使用JWT的实现方法

JWT简介 简介 JSON Web token简称JWT, 是用于对应用程序上的用户进行身份验证的标记。也就是说, 使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性, 同时保证应用程序的安全。 在身份验证过程中, 当用户使用其凭据成功登录时, 将返回 JSON Web token, 并且必须在本地保存 (通常在本地存储中)。每当用...

小屁孩大帅-保密的博客 863

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SpringBoot中使用JWT

JWT是什么我就不说了,这里只说名SpringBoot中怎么用。 首先在pom中天际依赖 1 <dependency> 2 <groupId>org.bitbucket.b_c</groupId> 3 <artifactId>jose4j</artifactId> 4 <version>0.6.5</version> 5 </dependency> 这里我用

cxzhq2002的杂记 2053

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

springboot引入整合JWT令牌

1、JWT的组成 JWT头: JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。 { "alg": "HS256", "typ": "JWT" } 在上面的代码中,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。 有效载荷 有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT指...

qq_39564710的博客 794

学习B站程序员青戈《从0开始带你手撸一套SpringBoot+Vue后台管理系统,让小白能跟着学会的项目实战》第16个视频的笔记(springboot集成jwt篇)

以上就是我所整理的学习笔记,我们下期再见!

m0_64266348的博客 3033

SpringBoot-使用心跳机制+JWT实现用户实时在线数统计

最近再做一个小程序项目,在这个项目中需要有一个管理员用户在线数实时刷新的功能,一开始用的是网上广为流传的做法,即创建一个session监听器,在用户登录时即创建一个session,监听器记录下来并且把count加一,当用户点击注销时把session给remove掉,count减一。但是这个方案只适合估计一个值,而不适合做精确的在线人数判断,譬如,当用户关闭浏览器时并不会触发session监听,当...

BoringError的博客 2万+

【SpringBoot】集成JWT实现用户认证

初识JWT 1.什么是JWT JSON Web Token (JWT) 是一个开放标准 (RFC 7519),它定义了一种紧凑且独立的方式,可以在客户端与服务器之间作为JSON对象安全地传输信息。 2.JWT使用场景 身份验证: 用户在登录以后,后续的每个请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源等。Session同样也可以实现这个功能,但是在使用Session的同时也会相应的...

Horace's Blog 5250

spring boot java jwt,Spring boot中使用jwt(示例代码)

spring boot 使用 jwt本文旨在介绍如何在spring boot中使用jwt,不会介绍什么是jwt。一、导入依赖1. spring-boot依赖org.springframework.bootspring-boot-starter-parent2.2.6.RELEASEorg.springframework.bootspring-boot-starter-weborg.projectl...

weixin_30039311的博客 320

springboot+shiro+redis+jwt模块化开发登录权限校验

springboot+shiro+jwt+redis实现登录模块1.demo项目结构1.1.导入依赖1.2. 登录服务ShiroConfig配置类自定义realm,这里主要定义授权和校验的规则JwtFilter,自定义JWT拦截器1.3管理服务LoginInterceptor管理端拦截器LoginConfigLoginStub 之前在公司的时候一直接触到这个东西,由于是同事写的,而且没有仔细的把流程实现一遍,总是有些一知半解的样子,就自己做了一个小的demo来过一遍流程。我这里使用的是模块化的开发,只涉及到

weixin_42840756的博客 1545

jwt+redis实现登录认证

上面代码是自定义的登录拦截器,在请求到来后,控制器方法执行前,会进入到拦截器的preHandle方法中,在这个方法里面,或获取到请求头中的Authorization属性值,也就是jwt的值,然后再获取到redis中的值,redis中key和values是相同的,都是jwt字符串的内容,所以这里是用jwt的值作为key去获取value,如果value有值则说明该请求是可以放行的(已经登录过),否则拦截请求,返回响应码401。这样原来的jwt就失效了,无法使用原来的jwt进行登录认证。JwtUtil工具类。

每天学习一点点 2474

Spring boot使用JWT

Spring boot使用JWT1.pom文件引入依赖:2.创建JwtUtils工具类:3.测试工具类: 1.pom文件引入依赖: <!--jwt依赖--> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId>...

weixin_43422096的博客 284
上一篇: SpringBoot学习笔记(15)-跨域请求
下一篇: SpringBoot学习笔记(17)-使用JWT记录用户实时在线数
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值