广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot整合JWT的入门指南
  • 912
分享到

SpringBoot整合JWT的入门指南

2024-04-02 19:04:59 912人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录1.Jwt2.JWT登录执行流程图3.为什么使用JWT?4.JWT的组成5.SpringBoot整合JWT测试总结1.JWT JWT(JSON WEB Token),为了

1.JWT

JWT(JSON WEB Token),为了在网络应用环境间传递声明而执行的一种基于jsON的开放标准。将用户信息加密到token中,服务器不保存任何用户信息,服务器通过保存的密钥验证token的正确性。

优点

1.简介:可以通过 URL POST 参数或者在 Http header 发送,因为数据量小,传输速度也很快;

2.自包含:负载中可以包含用户所需要的信息,避免了多次查询数据库

3.因为 Token 是以 JSON 加密的形式保存在客户端的,所以 JWT 是跨语言的,原则上任何 web 形式都支持;

4.不需要再服务端保存会话信息,特别适用于分布式微服务

缺点

1.无法作废已经发布的令牌;

2.不易应对数据过期;

2.JWT登录执行流程图

3.为什么使用JWT?

  • 在传统的用户登录认证中,因为http是无状态的,所以都是采用session+cokokie,用户登录成功,服务端会保存一个session,并给客户端一个sessionId,客户端会把sessionId保存在cookie中,每次请求都会携带sessionId。cookie+session模式是保存在内存中,在分布式服务中会面临session共享问题,随着用户量得增加,开销就越来越大。而JWT不需要在服务端保存会话信息,特别适合分布式微服务。
  • 简洁:可以用过URL,POST参数或者在HTTP Header发送,因为数据量小,传输速度也快
  • JWT支持跨语言
  • 自包含: 载荷中包含了所有用户所需要的信息,避免了多次查询数据库

4.JWT的组成

JWT由三部分构成,类似于如下:

eyJ0eXaiOiJKV1QiLCJhbGCiOiJIUzUxMiJ9.eyJzdWIiOiJscyIsImV4cCI6MTYyNDU5Nzc5Nn0.4kwT1elZCb_k2D7AxbuFHM35VmBK4PcmLaqHhcHEq4_wVe8GVO8ODypGSKksTs-hraBopBCm2IC9EC2rO-GHng

第一部分为头部(header),承载两部分信息

声明类型(JWT)

声明加密算法,默认为HMac SHA256


{
  "typ","JWT",
  "alg","HS256"
}

使用Base64加密后

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9 

第二部分为payload(载荷),存放有效信息的地方,这些有效信息分为三部分:

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明

其中,标准中注册的声明 (建议但不强制使用)包括如下几个部分 :

  • iss: jwt签发者;
  • sub: jwt所面向的用户;
  • aud: 接收jwt的一方;
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间;
  • nbf: 定义在什么时间之前,该jwt都是不可用的;
  • iat: jwt的签发时间;
  • jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

公共的声明部分:

公共的声明可以添加任何信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加铭感信息,因为在客户端可解密。

私有的声明部分:

私有的声明是提供者和消费者共同定义的声明,不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

第三部分为signature(签证)


var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);

//密钥就是我们定义的secret,加密后得到签证
var signature = HMACSHA256(encodedString, '密钥');

5.springBoot整合JWT

引入依赖


  <!--JWT-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.4.0</version>
        </dependency>
          <!--StringUtils工具包-->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <!--ConfigurationProperties出现异常-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

配置application.yml文件


server:
  port: 8888
spring:
  jwt:
    #过期时间
    expireTime: 1800000
    #加密密钥
    secret: lsyyp5201314
    #token返回头部
    header: LOGINTOKEN

JWT工具类


package org.best.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.alGorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Date;

@ConfigurationProperties(prefix = "spring.jwt")
public class JWTUtils {

    public static String header;
    private static String secret;
    private static String expireTime;

    
    public  static   String createToken(String sub){
        return JWT
                .create()
                .withSubject(sub)
                .withExpiresAt(new Date(System.currentTimeMillis()+Long.parseLong(expireTime)))
                .sign(Algorithm.HMAC512(secret));
    }

    
    public static String validateToken(String token){
        return JWT
                .require(Algorithm.HMAC512(secret))
                .build()
                .verify(token)
                .getSubject();
    }

    
    public static boolean refreshToken(String token) {
        Date expireDate = null;
        try {
            expireDate = JWT
                    .require(Algorithm.HMAC512(secret))
                    .build()
                    .verify(token)
                    .getExpiresAt();
        } catch (TokenExpiredException e) {
            return true;
        }
        return (expireDate.getTime()-System.currentTimeMillis())<0;
    }

    public void setHeader(String header) {
        this.header = header;
    }

    public String getSecret() {
        return secret;
    }

    public void setSecret(String secret) {
        this.secret = secret;
    }

    public String getExpireTime() {
        return expireTime;
    }

    public void setExpireTime(String expireTime) {
        this.expireTime = expireTime;
    }
}

自定义拦截器


package org.best.config;

import org.apache.commons.lang.StringUtils;
import org.best.common.TokenIsNullException;
import org.best.common.TokenValidateException;
import org.best.util.JWTUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.httpservletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String logintoken = request.getHeader("LOGINTOKEN");
        //如果token为空
        if (StringUtils.isBlank(logintoken)){
            throw new TokenIsNullException("请登录");
        }
        //校验Token
        String sub = JWTUtils.validateToken(logintoken);
        if (StringUtils.isBlank(sub)){
            throw new TokenValidateException("token校验失败");
        }

        //更新token有效期(生产新token)
        if (JWTUtils.refreshToken(logintoken)){
            String token = JWTUtils.createToken(sub);
            response.setHeader(JWTUtils.header,token);
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

注册拦截器


package org.best.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorReGIStry;
import org.springframework.web.servlet.config.annotation.WebmvcConfigurer;
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry
                .addInterceptor(new LoginInterceptor())
                .addPathPatterns("/find")
                .excludePathPatterns("/login");
    }
}

自定义异常


package org.best.common;


public class TokenValidateException extends RuntimeException {
    public TokenValidateException() {
    }

    public TokenValidateException(String message) {
        super(message);
    }
}


package org.best.common;


public class TokenIsNullException extends RuntimeException{
    public TokenIsNullException() {
    }

    public TokenIsNullException(String message) {
        super(message);
    }
}

自定义Controller


package org.best.controller;

import org.best.pojo.User;
import org.best.util.JWTUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;

@RestController
public class LoginController {
    @GetMapping("/login")
    public String login(User user, HttpServletResponse response){
        //这里就不做数据库查询了

        //根据用户id生成token
        String token = JWTUtils.createToken(String.valueOf(user.getId()));
        //将token存入HTTP响应头中
        response.setHeader(JWTUtils.header,token);
        return user.toString();
    }

    @GetMapping("/find")
    public String find(){
        return "success";
    }
}

测试

登录接口

我们来测试下find 接口 ,不带token会出现啥情况

带上token

总结

到此这篇关于SpringBoot整合JWT的文章就介绍到这了,更多相关SpringBoot整合JWT内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot整合JWT的入门指南

本文链接: https://www.lsjlt.com/news/129393.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot整合JWT的入门指南
    目录1.JWT2.JWT登录执行流程图3.为什么使用JWT?4.JWT的组成5.SpringBoot整合JWT测试总结1.JWT JWT(JSON Web Token),为了...
    99+
    2022-11-12
  • PHP入门指南:JWT令牌
    随着现代Web应用程序的不断发展,身份验证和安全性变得越来越重要。其中一种流行的方法是使用JWT(JSON Web Tokens)令牌进行身份验证。本文将向您介绍使用PHP实现JWT令牌的基础知识和技术。JWT令牌概述JWT是一个开放标准,...
    99+
    2023-05-21
    PHP 入门指南 JWT令牌
  • SpringBoot整合JWT Token的完整步骤
    目录背景一  JWT 消息构成1.1 组成1.2 header1.3 playload1.4 signature二 Spring Boot 和 JWT集成实例2.1 项目依...
    99+
    2022-11-12
  • springboot整合webSocket(看完即入门)
    webSocket 1、什么是webSocket?2、webSocket可以用来做什么3、webSocket协议4、服务端WebSocket操作类 5、客户端 1、什么是webSocket? WebSocket是一种在单个T...
    99+
    2023-08-16
    websocket java 网络协议
  • SpringBoot整合JWT的实现示例
    目录一. JWT简介二. Java实现JWT(SpringBoot方式整合)JWT总结一. JWT简介 1. 什么是JWT? JWT(JSON Web Token)是为了在...
    99+
    2022-11-12
  • JWT整合Springboot的方法步骤
    目录1.基于JWT认证1.1 认证流程1.2 JWT优势1.3 JWT的结构是什么2.使用JWT3.整合Springboot1.基于JWT认证 1.1 认证流程 首先,前...
    99+
    2022-11-12
  • springboot整合flowable框架入门步骤
    最近工作中有用到工作流的开发,引入了flowable工作流框架,在此记录一下springboot整合flowable工作流框架的过程,以便后续再次使用到时可以做一些参考使用,如果项目...
    99+
    2022-11-13
  • SpringBoot+Vue项目新手快速入门指南
    目录1. 项目技术选型2.数据库设计3. 后台搭建3.1 引入依赖3.2 swagger配置3.3实体类3.4 自动填充配置3.5 Mapper3.6 service3.7 cont...
    99+
    2022-11-13
  • 如何进行SpringBoot整合JWT的实现
    这篇文章跟大家分析一下“如何进行SpringBoot整合JWT的实现”。内容详细易懂,对“如何进行SpringBoot整合JWT的实现”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习...
    99+
    2023-06-26
  • SpringBoot整合JWT的介绍以及用法
    本篇内容主要讲解“SpringBoot整合JWT的介绍以及用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot整合JWT的介绍以及用法”吧!目录JWTJWT登录执行流程图为什么...
    99+
    2023-06-20
  • springboot整合sa-token简介及入门教程
    目录springboot:整合sa-token一、简介二、入门程序1.添加依赖2.sa-token配置类3.测试controller三、认证登录1.mysql配置类2.实体类3.ma...
    99+
    2023-05-20
    springboot 整合sa-token springboot sa-token
  • SpringBoot整合Redis入门之缓存数据的方法
    目录前言为什么要使用Redis呢?相关依赖配置数据库实体类RedisConfigMapperService接口Service实现类测试RedisController前言 Redis是...
    99+
    2022-11-12
  • PHP中的新手入门指南
    PHP是一门热门的前端编程语言,它功能强大、易学易用,被广泛用于网站的开发和维护中。对于初学者来说,PHP入门需要一定的学习和掌握,下面就为大家提供一些PHP中的新手入门指南。一、学习基本概念在学习PHP之前,你需要了解一些基本概念。PHP...
    99+
    2023-05-25
    PHP基础 PHP入门 新手指南
  • 从入门到精通:Go Spring Shell教程完整指南!
    Go Spring Shell是一个基于Spring Shell的轻量级应用程序框架,它允许开发人员快速构建命令行应用程序。它提供了许多有用的功能,例如命令行参数解析、命令历史记录、自动完成和模块化架构。在本文中,我们将从入门到精通,掌握...
    99+
    2023-10-14
    spring shell 教程
  • Java 索引函数 API:从入门到精通的完整指南
    在 Java 编程中,我们经常需要对字符串进行操作和处理。其中,一个非常重要的操作就是索引(即在字符串中查找某个特定的字符或子字符串)。Java 中提供了丰富的索引函数 API,能够帮助我们快速地完成字符串的索引操作。在本文中,我们将深入...
    99+
    2023-09-02
    索引 函数 api
  • SpringBoot整合minio快速入门教程(代码示例)
    分享一个快速使用springboot整合minio实现文件上传和下载的示例。前提是已经安装并运行minio服务,参考 minio快速入门文档 首先添加Minio的依赖 <dep...
    99+
    2022-11-13
  • SpringBoot整合mybatis-plus快速入门超详细教程
    目录前言mybatis-plus 简介mybatis-plus 优点相关链接mybatis-plus实例1、示例项目结构2、数据库准备3、pom.xml:4、application....
    99+
    2022-11-12
  • SpringBoot整合SpringSecurity实现JWT认证的项目实践
    目录前言1、创建SpringBoot工程2、导入SpringSecurity与JWT的相关依赖3.定义SpringSecurity需要的基础处理类4. 构建JWT token工具类5...
    99+
    2022-11-13
  • Apache 中 PHP 数据类型的完整指南:从入门到精通
    在 PHP 中,数据类型是非常重要的概念。PHP 中有多种数据类型,每种数据类型都有其特定的用途和规则。在本文中,我们将会介绍 PHP 中常用的数据类型,并提供一些演示代码来帮助你更好地理解这些数据类型。 字符串类型 字符串类型是 P...
    99+
    2023-10-06
    数据类型 教程 apache
  • springboot整合websocket最基础入门使用教程详解
    项目最终的文件结构 1 添加maven依赖 <dependency> <groupId>org.springframework.boot...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作