文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot整合JWT的介绍以及用法

2023-06-20 12:08

关注

本篇内容主要讲解“SpringBoot整合JWT的介绍以及用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot整合JWT的介绍以及用法”吧!

目录

1.JWT

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

优点

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

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

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

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

缺点

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

不易应对数据过期;

2.JWT登录执行流程图

SpringBoot整合JWT的介绍以及用法

3.为什么使用JWT?

4.JWT的组成

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

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJscyIsImV4cCI6MTYyNDU5Nzc5Nn0.4kwT1elZCb_k2D7AxbuFHM35VmBK4PcmLaqHhcHEq4_wVe8GVO8ODypGSKksTs-hraBopBCm2IC9EC2rO-GHng

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

声明类型(JWT)

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

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

使用Base64加密后

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9 

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

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

公共的声明部分:

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

私有的声明部分:

私有的声明是提供者和消费者共同定义的声明,不建议存放敏感信息,因为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: 8888spring:  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;@Configurationpublic 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;@RestControllerpublic 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";    }}

测试

登录接口

SpringBoot整合JWT的介绍以及用法

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

SpringBoot整合JWT的介绍以及用法

带上token

SpringBoot整合JWT的介绍以及用法

到此,相信大家对“SpringBoot整合JWT的介绍以及用法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯