JWT主要分成三个部分组成
Jwt生成:
Base64.ENcode(header).Base64.ENcode(PayLoad).签名值
Jwt优点:
1、减轻服务端压力。
2、查询效率比token高。
3、不容易被客户端篡改数据。
缺点:
1、如果一旦生成好一个jwt之后,后期是否可以销毁
2、Jwt playload数据多,占据服务器端带宽资源
jwt不是很安全,playload中不能存放敏感的信息,必要须加密
代码实现:
一、在spring-boot中创建jwt配置类
package com.test.test.config;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Date;
@Configuration
public class JwtConfig {
@Value("${jwt.secret}")//注入系统密钥属性
private String secret;
@Value("${jwt.expire}")//注入系统时效属性
private Long expire;
public String generateToken(String data) {
SignatureAlgorithm algorithm = SignatureAlgorithm.HS256;
byte[] keyBytes = secret.getBytes();
Key key = new SecretKeySpec(keyBytes, algorithm.getJcaName());
JwtBuilder builder = Jwts.builder()
.setId(data)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expire))
.signWith(algorithm, key);
return builder.compact();
}
public String decodeToken(String token) {
SignatureAlgorithm algorithm = SignatureAlgorithm.HS256;
byte[] keyBytes = secret.getBytes();
Key key = new SecretKeySpec(keyBytes, algorithm.getJcaName());
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getBody();
return claims.getId();
}
}
二、系统yml配置与需要导入的jwt配置如下
yml:
spring:
jwt:
secret: <你的密钥>
expire: <失效时间,以毫秒为单位>
pom.xml:
<!-- 引入jwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
三、实际场景应用
@Autowired
private JwtConfig jwtConfig;
@PostMapping("test")
public String Test(@RequestBody Map<String,Object> map) {
String encoded = jwtConfig.generateToken((String) map.get("传入的需加密的数据"));
System.out.println("加密后为:" + encoded);
String decoded = jwtConfig.decodeToken(encoded);
System.out.println("解密后为:" + decoded);
return encoded;
}