目录
- 一、引入依赖
- 二、JwtUtil 代码解读
- 三、LoginController 代码解读
- 四、整体代码
- 五、结果展示
一、引入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
二、JwtUtil 代码解读
这个Java类是一个工具类,用于生成和验证JSON Web Tokens(JWT)。JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。这个信息可以被验证和信任,因为它是数字签名的。在这个例子中,使用了Java的jsonwebtoken库。
下面是对这个类每行代码的详细解释:
import io.jsonwebtoken.*;
:引入jsonwebtoken库的所有类。import java.util.Date;
:引入java.util包下的Date类,用于处理日期和时间。import java.util.HashMap;
:引入java.util包下的HashMap类,用于创建哈希映射。import java.util.Map;
:引入java.util包下的Map接口,用于创建映射。public class JwtUtil {
:声明一个公共类JwtUtil。private static final String SECRET_KEY = "your-secret-key";
:在类中声明一个私有的、静态的、不可变的字符串变量SECRET_KEY,并初始化为"your-secret-key"。这个密钥用于JWT的签名和验证。public static String generateToken(String username) {
:声明一个公共的、静态的方法generateToken,接收一个字符串参数username,并返回一个字符串。这个方法用于生成JWT。Map<String, Object> claims = new HashMap<>();
:创建一个新的HashMap,用于存储JWT的载荷(claims)。claims.put("username", username);
:将username添加到载荷中,键是"username",值是传递给generateToken方法的username参数。return Jwts.builder()
:使用Jwts类的builder方法开始构建一个新的JWT。.setClaims(claims)
:设置JWT的载荷。.setExpiration(new Date(System.currentTimeMillis() + 3600000))
:设置JWT的过期时间。这里设置为当前时间之后的1小时(3600000毫秒)。.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
:使用HS256算法和上面定义的SECRET_KEY对JWT进行签名。.compact();
:生成JWT的字符串表示形式并返回。public static boolean validateToken(String token) {
:声明一个公共的、静态的方法validateToken,接收一个字符串参数token,并返回一个布尔值。这个方法用于验证JWT。try {
:开始一个try块,用于捕获可能出现的异常。Jwts.parser()
:使用Jwts类的parser方法开始解析JWT。.setSigningKey(SECRET_KEY)
:设置用于解析JWT的签名密钥。.parseClaimsJws(token)
:解析JWT,得到一个ClaimsJws对象。.getBody();
:获取JWT的载荷。如果没有异常抛出,那么JWT是有效的,所以返回true。} catch (ExpiredJwtException e) {
:捕获过期的JWT异常,返回false。} catch (UnsupportedJwtException e) {
:捕获不支持的JWT类型异常,返回false。} catch (MalformedJwtException e) {
:捕获格式错误的JWT异常,返回false。} catch (SignatureException e) {
:捕获签名验证失败的JWT异常,返回false。} catch (IllegalArgumentException e) {
:捕获其他非法情况的异常,返回false。}
:结束try-catch块。}
:结束validateToken方法。}
:结束JwtUtil类。
三、LoginController 代码解读
这是一个使用Java语言和Spring框架编写的简单的登录控制器。下面是对这段代码的详细解释:
import com.minster.yanapi.common.ApiResponse;
:导入名为ApiResponse
的类,它可能是一个用于封装API响应的通用类,可能包含成功或失败的消息、状态码等信息。import com.minster.yanapi.common.ResponseCode;
:导入名为ResponseCode
的枚举或类,可能包含API响应的状态码(例如,成功、失败、无效凭据等)。import org.springframework.web.bind.annotation.*;
:导入Spring MVC框架的注解,这些注解用于定义Web请求的处理方法。@RestController
:这是Spring MVC的注解,它表示该类是一个REST控制器。Spring会将此类中的方法返回的对象直接转化为JSON或XML等格式的响应数据。@RequestMapping("/hello")
:这是Spring MVC的注解,它定义了该控制器处理的基础URL路径。在这种情况下,所有路由都将以/hello
开始。public class LoginController {
:定义了一个公开的类LoginController
。@PostMapping("/login")
:这是Spring MVC的注解,它定义了一个处理方法,该方法将处理向/hello/login
路径发送的POST请求。public ApiResponse login(@RequestParam("username") String username, @RequestParam("password") String password) {
:定义了一个公开的方法login
,它接收两个参数,分别是用户名和密码。这两个参数是通过POST请求中的参数提供的。这个方法返回一个ApiResponse
对象。if ("admin".equals(username) && "password".equals(password)) {
:这是一个简单的验证过程,只检查用户名是否为"admin",密码是否为"password"。在真实的应用中,你应该连接数据库或其他数据源来验证凭据。String token = JwtUtil.generateToken(username);
:如果验证成功,它将生成一个JWT(JSON Web Token)并将其赋值给token
变量。return ApiResponse.success(token);
:返回一个成功的ApiResponse
,其中可能包含生成的JWT。return ApiResponse.failed(ResponseCode.Invalid_credentials);
:如果验证失败,返回一个失败的ApiResponse
,并携带一个表示无效凭据的状态码。}
:结束login
方法。}
:结束LoginController
类。
四、整体代码
import io.jsonwebtoken.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JwtUtil {
private static final String SECRET_KEY = "your-secret-key"; // 替换为你自己的密钥
public static String generateToken(String username) {
Map<String, Object> claims = new HashMap<>();
claims.put("username", username);
return Jwts.builder()
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 设置过期时间为1小时
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public static boolean validateToken(String token) {
try {
Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
return true;
} catch (ExpiredJwtException e) {
return false; // 标记为过期的JWT
} catch (UnsupportedJwtException e) {
return false; // 不支持的JWT类型
} catch (MalformedJwtException e) {
return false; // 格式错误的JWT
} catch (SignatureException e) {
return false; // 签名验证失败的JWT
} catch (IllegalArgumentException e) {
return false; // 其他非法情况
}
}
}
import com.minster.yanapi.common.ApiResponse;
import com.minster.yanapi.common.ResponseCode;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/hello")
public class LoginController {
@PostMapping("/login")
public ApiResponse login(@RequestParam("username") String username, @RequestParam("password") String password) {
// 在这里进行用户名和密码的验证,这里只是简单示例,实际情况下需要连接数据库等进行验证
if ("admin".equals(username) && "password".equals(password)) { // 假设用户名为"admin",密码为"password"时验证通过
String token = JwtUtil.generateToken(username); // 生成JWT并返回给客户端
return ApiResponse.success(token);
} else {
return ApiResponse.failed(ResponseCode.Invalid_credentials); // 返回错误信息给客户端,表示验证失败
}
}
}