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/
相关推荐
总结来说,JJwt-0.11.2是一个强大的JWT处理工具,可以帮助开发者在Java应用程序中实现JWT的创建、验证和解析,从而确保安全的身份验证和授权。在使用过程中,理解JWT的基础知识和JJwt的API是至关重要的。
开发者可以通过将这个文件添加到他们的项目类路径(classpath)来使用jjwt的功能,例如创建JWT、验证JWT等。 2. "破文件要那么分.txt":这个文件的名字似乎带有讽刺意味,可能是指有人索要分数来获取非完整或损坏的...
总的来说,`jjwt-0.7.0.jar`为Java开发者提供了一个强大的工具,帮助他们在应用程序中轻松地实现JWT相关的功能,包括身份验证、授权以及安全的数据传递。这个库支持多种签名算法,如HS256、HS384、HS512以及RSA和...
在jjwt中,可以使用`SignatureAlgorithm`类来指定签名算法,如HS256、HS384或HS512。 2. **创建JWT载荷(Payload)**:载荷部分包含了声明(claims),这些声明是关于JWT发行者、接收者或者任何其他相关的数据。...
JWT工具类的核心知识点包括: 1. **JWT结构**:JWT由三个部分组成,分别是Header(头部)、Payload(负载)和Signature(签名)。Header通常包含两个部分,token类型JWT和加密算法;Payload存储实际的数据,如用户...
《Shiro + Java-JWT无状态鉴权认证机制在SpringBoot环境中的应用》 在现代Web应用程序中,安全性和权限管理是至关重要的组成部分。本文将深入探讨如何在SpringBoot项目中结合Apache Shiro和Java JSON Web Tokens ...
JWT通常用于认证和授权,例如API的身份验证。 在JWT中,签名算法是关键部分,用于确保JWT的完整性和防止篡改。这里提到的`HS256`和`RS256`是两种常见的签名算法。 1. **HS256(HMAC SHA-256)**: - HMAC(Hash-...
- 使用Postman或类似工具模拟登录请求,获取JWT Token,然后用这个Token访问受保护的API,验证整个流程是否正常工作。 通过以上步骤,你就成功地在Spring Boot 3.x中结合Spring Security实现了JWT登录验证。这种...
- 使用`jjwt`库(Java JWT)生成JWT。这个库提供了一组API,可以轻松地创建、解析和验证JWT。 - 在用户成功登录后,服务器将生成一个包含用户信息的JWT并发送给客户端。 - 客户端在后续请求中将此JWT作为授权头发...
JWTUtil是Java中用于处理JWT的工具类,通常包括JWT的生成、解析和验证功能。 JWT签名生成是JWT安全性的重要环节。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。签名是通过将头部和载荷...
- **collect-0.8.0.jar**:可能包含了Google的Guava库,提供了一组通用的集合类和实用工具,对于处理数据结构和算法非常有用。 - **jose4j-0.6.4.jar**:这是一个Java Object Signing and Encryption库,用于处理...
3. **JWT实现**:创建JWT工具类,用于生成和解析Token。设置Token的有效期,并在Token中携带用户信息。 4. **Redis配置**:配置Redis连接池,设置Key-Value的过期策略,确保Token能够在过期前被自动刷新。 5. **...
JWT(Json Web Token)用于安全地在客户端和服务器之间传输信息,而Swagger则是用于构建RESTful API的接口文档工具,使得开发者能够更方便地理解和使用API。 JWT是一种轻量级的身份验证机制,它允许服务端签发一个...
JWT是一种轻量级的身份验证机制,而Knife4j则是一个优秀的Swagger UI增强工具,用于构建高质量的API文档。 首先,让我们了解JWT的基本原理。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)...
4. **验证JWT**:对于每个受保护的API,我们需要检查请求头中的JWT。这可以通过自定义过滤器实现,过滤器会在请求处理之前验证JWT的有效性。 5. **刷新JWT**:为了保持会话持久,我们可以提供一个刷新JWT的机制。当...
**Spring Boot 整合 JWT 2** 在现代Web应用程序中,安全性和权限...通过Spring Security的配置和JWT工具类的编写,我们能够轻松地实现这一功能。在实际开发中,可以根据具体需求进行调整和优化,确保应用的安全性。
总之,JWTs和JJWT库为Java开发者提供了强大且灵活的身份验证和授权工具。通过深入研究`jjwt-master`中的源代码,可以更深入地了解JWT的工作机制和JJWT库的实现细节,这对于开发安全的Web应用非常有价值。
- `JwtUtils`:这个工具类包含了JWT的生成和验证方法,使用了JWT库(如jjwt)提供的API。 6. **项目运行流程** - 用户发起登录请求,携带用户名和密码。 - Spring Security验证用户名和密码,如果正确,生成JWT...
同时,可以创建一个工具类,提供生成和验证 JWT 的方法。 3. **安全配置**:Spring Boot 提供了 `WebSecurityConfigurerAdapter` 来进行安全配置。在这个类中,我们可以禁用 CSRF 保护,因为 JWT 不需要,然后配置 ...
使用IDEA运行`springsecuritydemo5`,并使用Postman或其他工具模拟登录请求,获取JWT token,然后尝试访问受保护的资源,查看认证过程是否正常。 在实际开发中,你可能还需要考虑更多细节,如token的刷新机制、...