IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> JWT跨域认证解决登录注册 -> 正文阅读

[开发测试]JWT跨域认证解决登录注册

存储用户登陆状态方案:

方案1:session存储。

  • 缺点:服务器集群,session数据不能共享(因为session是保存在JVM中)。

  • 缺点:无法实现跨域请求。A项目和B项目,现在要求用户只要在其中一个项目登录,再访问另一个项目就会自动登录,实现跨域请求的认证。

  • 缺点:耗费服务器内存

方案2:JWT

另一种方案是JVM索性不保存 session 数据了,所有数据都保存在客户端或保存到一个公共的存储介质,JWT 就是这种方案的一个代表。

JWT介绍

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。是用于对应用程序上的用户进行身份验证的标记。也就是说,使用 JWT 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性,同时保证应用程序的安全。

在身份验证过程中, 当用户使用其凭据成功登录时, 将返回 JSON Web token。

每当用户要访问受保护的资源时,需要在请求头中携带 JWT。后端服务器接收到带有 JWT 的请求时,首先要做的是验证token。

JWT格式

  • JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.C

  • A由JWT头部信息header加密得到

  • B由JWT用到的身份验证信息json数据加密得到

  • C由A和B加密得到,是校验部分

JWT使用

1、导入依赖:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
</dependency>

测试类:

/**
 * jwt单元测试
 */
public class JwtTest {

    @Test
    public void testJwt(){
        // 1.定义加密内容
        Map<String, Object> map = new HashMap<>();
        map.put("id",  1);
        map.put("mobile", "12345678901");

        // 2.定义加密密钥
        String secret = "XXX";

        // 3.生成jwt字符串
        String token = Jwts.builder()
                .setClaims(map)
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();

        System.out.println("生成token:" + token);

        // 4.解析token,获取map集合
        Map<String, Object> body = (Map<String, Object>)
                Jwts.parser().setSigningKey(secret).parse(token).getBody();

        System.out.println("body内容:" + body);
    }
}

2、抽取JWT工具类:

public class JwtUtils {
//参数1、id 参数2、手机号码 参数3、加密的密匙
    public static String createToken(Long id, String phone, String secret) {
        // 定义要加密的数据
        Map<String,Object> map = new HashMap<>();
        map.put("id", id);
        map.put("phone", phone);

        // 生成token并返回
        return Jwts.builder()
                .setClaims(map) // 声明加密的数据
                .signWith(SignatureAlgorithm.HS256, secret) // 指定加密算法与密钥
                .compact();
    }
}

3、yml 配置密钥

secret: XXX # 密钥

4、类中使用通过@Value注解加上yml配置密匙全路径获取-密钥

 // 获取密钥
    @Value("${XXX}")
    private String secret;


        // 【使用抽取的JWT工具类生成token、存储token到redis中】
        String token = JwtUtils.createToken(user.getId(), phone, secret);
        // 【往token中存储的应该是整个用户对象数据,所以这里需要把对象转换为json字符串存储】
        String tokenData = JSON.toJSONString(user);
        // 【生成的token作为key,用户数据作为value,存储到redis中,并设置过期时间】
        redisTemplate.opsForValue().set(TOKEN_KEY + token, tokenData, Duration.ofHours(4));

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:30:21  更:2021-09-18 10:31:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 20:40:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码