JWT
小白勿喷版,但超详细!
有错误、有更好的思路、更好的实现方式请评论区留言更正,感谢!
- 依赖
<!-- Jwt -->
<!-- JWT -->
<!-- <dependency>-->
<!-- <groupId>com.auth0</groupId>-->
<!-- <artifactId>java-jwt</artifactId>-->
<!-- <version>3.4.1</version>-->
<!-- </dependency>-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- 常用工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.25</version>
</dependency>
<!--避免使用jwt时,jdk版本太低导致的问题-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
1.两个Jwt依赖用哪个都可以,生成token的语法略有不同
2.如果使用jjwt这个,且JDK版本高于1.8,需要配合jaxb-api来使用,否则会报错:
java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
因为 javax.xml.bind这个东西在1.8有,在高版本就没有了
3.用jjwt的话,密钥不能设置太短,否则也报错
java.lang.IllegalArgumentException: secret key byte array cannot be null or empty.
- Jwt工具类
import cn.hutool.core.util.StrUtil;
import cn.lhn.dto.UserDTO;
import cn.lhn.service.IUserService;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Component
@Slf4j
public class JwtUtil {
//token过期时间
private static final int EXPIRATION_TIME = 2;
//密钥
private static final String SECRET = "arbitrary!@#QWE";
private static IUserService staticUserService; //静态方法需要静态的属性
@Autowired
private IUserService userService;
@PostConstruct
public void setUserService(){
staticUserService = userService;
}
/**
* 使用userId、password生成token
* @param userId 用户id
* @return
*/
public static String createToken(Integer userId){
//头部信息map
Map<String,Object> claims = new HashMap<>();
claims.put("userId",userId);
return Jwts.builder().setClaims(claims) //body数据
.signWith(SignatureAlgorithm.HS256,SECRET) //签发算法 , 密钥
.setIssuedAt(new Date()) //签发时间
.setExpiration(DateUtil.setAddHour(EXPIRATION_TIME)).compact(); //token有效期
}
/**
* 获取用户登录信息
* @return User
*/
public static UserDTO getCurrentUser(String token){
if (StrUtil.isBlank(token))
return null;
Map<String,Object> map = verifyToken(token);
if (map == null)
return null;
UserDTO user = new UserDTO();
user.setUserId((Integer) map.