`

java jjwt-api使用,java jwt使用,java jwt 工具类

阅读更多

java jjwt-api使用,java jwt使用,java jwt 工具类,Java Web Token工具类

Springboot jwt整合

 

================================

©Copyright 蕃薯耀 2020-12-02

http://fanshuyao.iteye.com/

 

一、引入jjwt-api依赖

<properties>
    <!-- 构建时编码 -->    
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 输出时编码 -->
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <!-- JDK版本 -->
    <java.version>1.8</java.version>
    <jjwt.version>0.11.2</jjwt.version>
</properties>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>${jjwt.version}</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>${jjwt.version}</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>${jjwt.version}</version>
    <scope>runtime</scope>
</dependency>

 

 

二、 jjwt-api实现工具类

import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.lqy.study.exception.RunException;
import com.lqy.study.utils.DateUtils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.MissingClaimException;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.io.Decoders;

@Component
public class JwtUtils {

    private static Logger log = Logger.getLogger(JwtUtils.class);
    
    
    private static String secretKey;
    
    private static String aa;//测试静态变量注入
    
    /**
     * 静态变量注入
     * 从配置文件读取jjwt.key属性
     * 注入key,set方法不能是static
     * @param secretKey
     */
    @Value("${jjwt.key}")
    public void setSecretKey(String secretKey) {
        JwtUtils.secretKey = secretKey;
    }
    
    
    /**
     * 静态实体变量注入
     * jjwtProperties需要配置:@ConfigurationProperties(prefix = "jjwt", ignoreUnknownFields = true)
     * @param jjwtProperties
     */
    @Autowired
    public void setSecretKey(JjwtProperties jjwtProperties) {
        JwtUtils.aa = jjwtProperties.getKey();
    }


    private static String KEY_CLAIMS = "key_claims";
    private static String SUBJECT = "key_subject";
    
    private JwtUtils(){
        
    }
    
    
    /**
     * 生成token
     * @return
     * @throws ParseException
     */
    public static String getToken() throws ParseException {
        //Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
        
        log.info("aa===" + aa);
        
        
        Date now = new Date();
        Date expirationDate = DateUtils.addMinute(null, 2);//增加2分钟的过期时间,用于测试
        
        log.info("now===" + DateUtils.formatDateTime(now));
        log.info("expirationDate===" + DateUtils.formatDateTime(expirationDate));
        
        Map<String, Object> claims = new HashMap<String, Object>();
        User user = new User();
        user.setId(1000L);
        user.setName("张三");
        claims.put(KEY_CLAIMS, user);
        
        String token = Jwts.builder()
                        .setClaims(claims)//必须放最前面,不然后面设置的东西都会没有:如setExpiration会没有时间
                        .setId(UUID.randomUUID().toString())
                        .setSubject(SUBJECT)
                        .setIssuedAt(now)
                        .setExpiration(expirationDate)//过期时间
                        .signWith(SignatureAlgorithm.HS256, getSecretKey())
                        .compact();
        
        log.info("token===" + token);
        
        return token;
    }
    
    
    /**
     * 解析token,并返回User对象
     * @param token
     * @return
     * @throws ParseException
     */
    public static User parseToken(String token) throws ParseException {
        
        String msg = null;
        try {
            Jws<Claims> jws = Jwts.parser()
                    .setSigningKey(getSecretKey())
                    .requireSubject(SUBJECT)//校验必须有这个属性,可以省略这步
                    .parseClaimsJws(token);
    
            Claims claims = jws.getBody();//Claims是一个Map
            
            log.info("claims===" + JSONUtil.toJsonStr(claims));
            log.info("claims.getIssuedAt()===" + claims.getIssuedAt());
            log.info("claims.getExpiration()===" + claims.getExpiration());
            
            //map转实体
            User user = BeanUtil.toBean(claims.get(KEY_CLAIMS), User.class);
            log.info("user===" + JSONUtil.toJsonStr(user));
            
            return user;
            
            
        }catch (SignatureException se) {
            msg = "密钥错误";
            log.error(msg, se);
            throw new RunException(msg);
            
        }catch (MalformedJwtException me) {
            msg = "密钥算法或者密钥转换错误";
            log.error(msg, me);
            throw new RunException(msg);
            
        }catch (MissingClaimException mce) {
            msg = "密钥缺少校验数据";
            log.error(msg, mce);
            throw new RunException(msg);
            
        }catch (ExpiredJwtException mce) {
            msg = "密钥已过期";
            log.error(msg, mce);
            throw new RunException(msg);
            
        }catch (JwtException jwte) {
            msg = "密钥解析错误";
            log.error(msg, jwte);
            throw new RunException(msg);
        }
        
    }
    
    
    /**
     * 获取自定义密钥
     * @return
     */
    private static byte[] getSecretKey() {
        //log.info("secretKey = " + secretKey);
        if(StringUtils.isBlank(secretKey)) {
            throw new RunException("jjwt配置的密钥不能为空");
        }
        return Decoders.BASE64.decode(secretKey);
    }
    
    
    public static void main(String[] args) throws Exception {
        getToken();
    }

    
}

 

 

User类:

public class User {

    private Long id;
    private String name;
    
    
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
}

 

三、科普springboot静态变量注入的方式

1、静态变量secretKey通过配置文件application.properties的属性注入,并使用base64编码,取出来的时候,需要解码(配置文件的属性也可以不编码,直接取出来)

jjwt.key=aXNsZWVfaGFoYQ==

 

注入方式:方法加注解@Value("${jjwt.key}"),变量作为参数

/**
 * 静态变量注入
 * 从配置文件读取jjwt.key属性
 * 注入key,set方法不能是static
 * @param secretKey
 */
@Value("${jjwt.key}")
public void setSecretKey(String secretKey) {
    JwtUtils.secretKey = secretKey;
}

 

 

2、静态实体变量 jjwtProperties 注入,同样通过通过配置文件application.properties的属性注入,但可以直接配置多个属性(仅用于学习,可忽略):

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "jjwt", ignoreUnknownFields = true)
public class JjwtProperties {

    private String key;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
}

 

注入的方式:方法加上@Autowired注解,实体作为参数

/**
 * 静态实体变量注入
 * jjwtProperties需要配置:@ConfigurationProperties(prefix = "jjwt", ignoreUnknownFields = true)
 * @param jjwtProperties
 */
@Autowired
public void setSecretKey(JjwtProperties jjwtProperties) {
    JwtUtils.aa = jjwtProperties.getKey();
}

 

 

 springboot 整合java-jwt,见:

 https://www.iteye.com/blog/fanshuyao-2517923

 

================================

©Copyright 蕃薯耀 2020-12-02

http://fanshuyao.iteye.com/

1
1
分享到:
评论

相关推荐

    jjwt-0.11.2.zip

    总结来说,JJwt-0.11.2是一个强大的JWT处理工具,可以帮助开发者在Java应用程序中实现JWT的创建、验证和解析,从而确保安全的身份验证和授权。在使用过程中,理解JWT的基础知识和JJwt的API是至关重要的。

    jjwt-0.9.1.zip

    开发者可以通过将这个文件添加到他们的项目类路径(classpath)来使用jjwt的功能,例如创建JWT、验证JWT等。 2. "破文件要那么分.txt":这个文件的名字似乎带有讽刺意味,可能是指有人索要分数来获取非完整或损坏的...

    java jwt jar包

    总的来说,`jjwt-0.7.0.jar`为Java开发者提供了一个强大的工具,帮助他们在应用程序中轻松地实现JWT相关的功能,包括身份验证、授权以及安全的数据传递。这个库支持多种签名算法,如HS256、HS384、HS512以及RSA和...

    jjwt-0.11.2.tar.gz

    在jjwt中,可以使用`SignatureAlgorithm`类来指定签名算法,如HS256、HS384或HS512。 2. **创建JWT载荷(Payload)**:载荷部分包含了声明(claims),这些声明是关于JWT发行者、接收者或者任何其他相关的数据。...

    jwt工具类,包含引入的包

    JWT工具类的核心知识点包括: 1. **JWT结构**:JWT由三个部分组成,分别是Header(头部)、Payload(负载)和Signature(签名)。Header通常包含两个部分,token类型JWT和加密算法;Payload存储实际的数据,如用户...

    Shiro + Java-JWT无状态鉴权认证机制

    《Shiro + Java-JWT无状态鉴权认证机制在SpringBoot环境中的应用》 在现代Web应用程序中,安全性和权限管理是至关重要的组成部分。本文将深入探讨如何在SpringBoot项目中结合Apache Shiro和Java JSON Web Tokens ...

    JWT的RS256和HS256签名算法Demo.zip

    JWT通常用于认证和授权,例如API的身份验证。 在JWT中,签名算法是关键部分,用于确保JWT的完整性和防止篡改。这里提到的`HS256`和`RS256`是两种常见的签名算法。 1. **HS256(HMAC SHA-256)**: - HMAC(Hash-...

    spring boot3.x结合spring security最新版实现jwt登录验证

    - 使用Postman或类似工具模拟登录请求,获取JWT Token,然后用这个Token访问受保护的API,验证整个流程是否正常工作。 通过以上步骤,你就成功地在Spring Boot 3.x中结合Spring Security实现了JWT登录验证。这种...

    Java_关于如何使用Spring boot 3和Spring security 6实现JWT安全性的示例项目.zip

    - 使用`jjwt`库(Java JWT)生成JWT。这个库提供了一组API,可以轻松地创建、解析和验证JWT。 - 在用户成功登录后,服务器将生成一个包含用户信息的JWT并发送给客户端。 - 客户端在后续请求中将此JWT作为授权头发...

    JwtUtil.rar_Jwt签名生成_jwtutil_jwt文件上传

    JWTUtil是Java中用于处理JWT的工具类,通常包括JWT的生成、解析和验证功能。 JWT签名生成是JWT安全性的重要环节。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。签名是通过将头部和载荷...

    苹果授权登陆 服务端验证(java)

    - **collect-0.8.0.jar**:可能包含了Google的Guava库,提供了一组通用的集合类和实用工具,对于处理数据结构和算法非常有用。 - **jose4j-0.6.4.jar**:这是一个Java Object Signing and Encryption库,用于处理...

    sping-boot-shiro-jwt-redis.zip

    3. **JWT实现**:创建JWT工具类,用于生成和解析Token。设置Token的有效期,并在Token中携带用户信息。 4. **Redis配置**:配置Redis连接池,设置Key-Value的过期策略,确保Token能够在过期前被自动刷新。 5. **...

    Springboot整合JWT,Swagger.zip

    JWT(Json Web Token)用于安全地在客户端和服务器之间传输信息,而Swagger则是用于构建RESTful API的接口文档工具,使得开发者能够更方便地理解和使用API。 JWT是一种轻量级的身份验证机制,它允许服务端签发一个...

    springboot整合jwt整合knife4j.zip

    JWT是一种轻量级的身份验证机制,而Knife4j则是一个优秀的Swagger UI增强工具,用于构建高质量的API文档。 首先,让我们了解JWT的基本原理。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)...

    sringboot-jwt.zip

    4. **验证JWT**:对于每个受保护的API,我们需要检查请求头中的JWT。这可以通过自定义过滤器实现,过滤器会在请求处理之前验证JWT的有效性。 5. **刷新JWT**:为了保持会话持久,我们可以提供一个刷新JWT的机制。当...

    spring boot整合JWT 2

    **Spring Boot 整合 JWT 2** 在现代Web应用程序中,安全性和权限...通过Spring Security的配置和JWT工具类的编写,我们能够轻松地实现这一功能。在实际开发中,可以根据具体需求进行调整和优化,确保应用的安全性。

    JWTs json web tokens资料

    总之,JWTs和JJWT库为Java开发者提供了强大且灵活的身份验证和授权工具。通过深入研究`jjwt-master`中的源代码,可以更深入地了解JWT的工作机制和JJWT库的实现细节,这对于开发安全的Web应用非常有价值。

    SpringBoot+Security+JWT src code

    - `JwtUtils`:这个工具类包含了JWT的生成和验证方法,使用了JWT库(如jjwt)提供的API。 6. **项目运行流程** - 用户发起登录请求,携带用户名和密码。 - Spring Security验证用户名和密码,如果正确,生成JWT...

    jwt,springboot整合

    同时,可以创建一个工具类,提供生成和验证 JWT 的方法。 3. **安全配置**:Spring Boot 提供了 `WebSecurityConfigurerAdapter` 来进行安全配置。在这个类中,我们可以禁用 CSRF 保护,因为 JWT 不需要,然后配置 ...

    Spring Boot整合JWT

    使用IDEA运行`springsecuritydemo5`,并使用Postman或其他工具模拟登录请求,获取JWT token,然后尝试访问受保护的资源,查看认证过程是否正常。 在实际开发中,你可能还需要考虑更多细节,如token的刷新机制、...

Global site tag (gtag.js) - Google Analytics