SpringBoot登录校验-JWT令牌
2023-12-13 07:39:32
JWT(JSON Web Token)是一种用于在网络上传输信息的开放标准(RFC 7519),它由三部分组成:头部、载荷和签名。
JWT令牌的特点包括:
简洁(Compact):JWT令牌可以在URL、POST参数、HTTP头部等多种方式传输,便于在各种场景下使用。
自包含(Self-contained):JWT令牌包含了所有用户所需的信息,避免了需要查询数据库的开销。
数字签名(Digital Signature):JWT令牌可以使用数字签名进行验证,确保数据的完整性和安全性。
JWT令牌的流程通常包括以下步骤:
-
用户登录时,服务器验证用户的身份,并生成JWT令牌。
-
服务器将JWT令牌返回给客户端,客户端在后续的请求中携带JWT令牌。
-
服务器在接收到带有JWT令牌的请求时,验证JWT令牌的有效性和完整性,并根据其中的信息进行相应的处理。
SpringBoot中JWT令牌的登录校验和应用:
- 添加依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
- 创建JWT工具类:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Component
public class JwtTokenUtil {
// 从配置文件中读取密钥和过期时间
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private Long expiration;
/**
* 生成JWT令牌
* @param username 用户名
* @return JWT令牌
*/
public String generateToken(String username) {
// 设置JWT令牌中的信息
Map<String, Object> claims = new HashMap<>();
claims.put("sub", username);
claims.put("created", new Date());
// 生成JWT令牌
return Jwts.builder()
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
/**
* 从JWT令牌中获取用户名
* @param token JWT令牌
* @return 用户名
*/
public String getUsernameFromToken(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
return claims.getSubject();
}
/**
* 从JWT令牌中获取过期时间
* @param token JWT令牌
* @return 过期时间
*/
public Date getExpirationDateFromToken(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
return claims.getExpiration();
}
/**
* 验证JWT令牌的有效性
* @param token JWT令牌
* @param username 用户名
* @return JWT令牌是否有效
*/
public boolean validateToken(String token, String username) {
String tokenUsername = getUsernameFromToken(token);
return (tokenUsername.equals(username) && !isTokenExpired(token));
}
/**
* 判断JWT令牌是否已过期
* @param token JWT令牌
* @return JWT令牌是否已过期
*/
private boolean isTokenExpired(String token) {
Date expiration = getExpirationDateFromToken(token);
return expiration.before(new Date());
}
}
- 创建登录接口:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoginController {
@Autowired
private JwtTokenUtil jwtTokenUtil;
@PostMapping("/login")
public String login(@RequestBody User user) {
// 校验用户名和密码
// ...
// 生成JWT令牌
String token = jwtTokenUtil.generateToken(user.getUsername());
return token;
}
}
- 创建资源接口:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ResourceController {
@Autowired
private JwtTokenUtil jwtTokenUtil;
@GetMapping("/resource")
public String getResource(@RequestHeader("Authorization") String token) {
// 从JWT令牌中获取用户名
String username = jwtTokenUtil.getUsernameFromToken(token);
// 根据用户名获取资源
// ...
return "resource";
}
}
以上代码演示了如何在SpringBoot中使用JWT令牌进行登录校验和资源访问控制。在实际应用中,可以根据具体需求对JWT令牌进行更多的定制和扩展。
文章来源:https://blog.csdn.net/qq_44577699/article/details/134942554
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!