SpringBoot集成jwt,解决前后端分离token跨域验证问题


前言

在之前进行登录验证的,主要用的是session的方式,session是由客户端首次发起请求,后端为此创建空间,返回给前端用来身份识别标识sessionId,前端基于cookie存储起来,在后面的请求中都会携带sessionId,后端就会根据这sessionId识别出身份信息。前端sessionid是基于cookie进行存储的。这种方式会存在安全问题,如果被不法分子拦截这个sessionId或cookie信息,就能跳过后端验证,从而盗取你的信息。而且seesion这种方式容易占用到服务端的内存空间。在前后端分离的方式,seesion也不适合作为身份验证方式。为了解决跨域问题,采用基于token方式解决。

一、jwt介绍?

1.1 什么是JWT

JWT (全称:Json Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

上面说法比较文绉绉,简单点说就是一种认证机制,让后台知道该请求是来自于受信的客户端。

什么是JWT

JWT的配置介绍

二、Springboot集成JWT

2.1 导入maven

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

2.2 创建工具类,配置jwt

创建Jwtutil类,用于创建jwt字符和解析jwt.

package com.sky.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

public class JwtUtil {
    /**
     * 生成jwt
     * 使用Hs256算法, 私匙使用固定秘钥
     *
     * @param secretKey jwt秘钥
     * @param ttlMillis jwt过期时间(毫秒)
     * @param claims    设置的信息
     * @return
     */
    public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
        // 指定签名的时候使用的签名算法,也就是header那部分
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        // 生成JWT的时间
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        // 设置jwt的body
        JwtBuilder builder = Jwts.builder()
                // 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
                .setClaims(claims)
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))
                // 设置过期时间
                .setExpiration(exp);

        return builder.compact();
    }

    /**
     * Token解密
     *
     * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
     * @param token     加密后的token
     * @return
     */
    public static Claims parseJWT(String secretKey, String token) {
        // 得到DefaultJwtParser
        Claims claims = Jwts.parser()
                // 设置签名的秘钥
                .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
                // 设置需要解析的jwt
                .parseClaimsJws(token).getBody();
        return claims;
    }

}

testDemo.java

package com.example.jwtproject.demos;

import io.jsonwebtoken.Claims;

import java.util.HashMap;
import java.util.Map;

/**
 * @author : by smomo
 * @date : 2023/7/17 18:35
 * @description :
 */
public class TestDemo {

    private static final String secret_key="itcast";
    private static final int ttl=72000;

    private static final String token_name="token";


    public static void main(String[] args) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("id",1);
        String token= JwtUtil.createJWT(secret_key, ttl, claims);
        System.out.println("生成的jwt:"+token);
        Claims claims1 = JwtUtil.parseJWT(secret_key, token);
        System.out.println("解析后的token:"+claims1);
        String id = claims1.getId();
        System.out.println("解析后的token的id"+id);
        System.out.println("解析后的token的有效期"+claims1.getExpiration());
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值