回顾JWT是什么?JWT的用途。明天项目中有用到
时间: 2023-07-04 18:18:02 浏览: 122
JWT(JSON Web Token)是一种用于在网络上传递信息的安全方式,它通过在用户和服务器之间传递被加密的JSON对象来实现身份验证和授权。
JWT通常由三部分组成:头部、载荷和签名。其中头部用于描述JWT的元数据,载荷存储实际的数据,签名则用于验证JWT的合法性。
JWT的用途主要有以下几个方面:
1. 身份验证:通过验证JWT的签名,可以确定JWT中存储的数据是由合法的发送方生成的,从而实现身份验证。
2. 信息交换:由于JWT中存储的数据是经过加密和签名的,因此可以安全地在网络上传递信息。
3. 授权:通过在JWT中存储用户的角色、权限等信息,可以实现基于角色或权限的访问控制。
在实际项目中,我们可以使用JWT来实现身份验证和授权。具体而言,当用户登录成功后,我们可以生成一个JWT,并将其存储在客户端(通常是浏览器)的Cookie或本地存储中。之后,客户端每次向服务器发送请求时,都需要将JWT作为Authorization头的值传递给服务器。服务器接收到请求后,可以通过解析JWT的签名来验证用户的身份,并根据JWT中存储的信息进行相应的授权操作。
需要注意的是,JWT虽然具有很强的安全性,但也存在被伪造的风险。因此,在使用JWT时,我们需要采取一些额外的安全措施,例如设置JWT的过期时间、使用HTTPS协议等。
相关问题
回顾JWT是什么?JWT的用途。明天项目中有用到代码
下面是一个使用JWT实现身份验证和授权的示例代码:
1. 引入依赖
在pom.xml中添加以下依赖:
```xml
<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>
```
2. 定义JWT工具类
```java
public class JwtUtils {
private static final String SECRET_KEY = "my_secret_key"; // 密钥
private static final long EXPIRATION_TIME = 60 * 60 * 1000; // 过期时间为1小时
/**
* 生成JWT
* @param subject 载荷中的信息
* @return JWT
*/
public static String generateJwt(String subject) {
Date now = new Date();
Date expiration = new Date(now.getTime() + EXPIRATION_TIME);
return Jwts.builder()
.setSubject(subject)
.setIssuedAt(now)
.setExpiration(expiration)
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
/**
* 解析JWT
* @param jwt JWT
* @return 载荷中的信息
*/
public static String parseJwt(String jwt) {
try {
Claims claims = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(jwt)
.getBody();
return claims.getSubject();
} catch (Exception e) {
return null;
}
}
}
```
在上面的代码中,我们使用了jjwt库来生成和解析JWT。
3. 在登录接口中生成JWT并返回给客户端
```java
@PostMapping("/login")
public ResponseEntity<String> login(@RequestParam String username, @RequestParam String password) {
// 验证用户名和密码
if (!isValidUser(username, password)) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password");
}
// 生成JWT并返回给客户端
String jwt = JwtUtils.generateJwt(username);
return ResponseEntity.ok().header(HttpHeaders.AUTHORIZATION, "Bearer " + jwt).build();
}
```
在上面的代码中,我们在登录成功后生成了一个JWT,并将其作为Authorization头的值设置在响应头中返回给客户端。
4. 在需要身份验证和授权的接口中验证JWT
```java
@GetMapping("/info")
public ResponseEntity<String> getInfo(@RequestHeader(name = HttpHeaders.AUTHORIZATION) String authorization) {
// 验证Authorization头是否合法
String jwt = StringUtils.removeStart(authorization, "Bearer ");
String username = JwtUtils.parseJwt(jwt);
if (StringUtils.isBlank(username)) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
// 根据用户名获取用户信息并返回
UserInfo userInfo = getUserInfo(username);
return ResponseEntity.ok(userInfo.toString());
}
```
在上面的代码中,我们首先从Authorization头中获取JWT,并使用JwtUtils工具类来解析JWT。如果JWT合法,则验证通过,否则返回401 Unauthorized。之后,我们根据用户名获取用户信息并返回。
阅读全文