springboot如何使用Jwts
时间: 2023-11-16 21:49:37 浏览: 78
在Spring Boot中,可以使用jjwt库来创建、解析和验证Jwts。可以在pom.xml文件中添加jjwt依赖:
```xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
```
接下来,可以创建一个JwtUtils工具类,用于创建、解析和验证Jwts。例如:
```java
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Component
public class JwtUtils {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private Long expiration;
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
claims.put("sub", userDetails.getUsername());
claims.put("iat", new Date());
return Jwts.builder()
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
public String getUsernameFromToken(String token) {
return getClaimsFromToken(token).getSubject();
}
public Date getExpirationDateFromToken(String token) {
return getClaimsFromToken(token).getExpiration();
}
public boolean validateToken(String token, UserDetails userDetails) {
String username = getUsernameFromToken(token);
return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
}
private Claims getClaimsFromToken(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
}
private boolean isTokenExpired(String token) {
Date expiration = getExpirationDateFromToken(token);
return expiration.before(new Date());
}
}
```
在上面的代码中,generateToken方法用于创建Jwts,getUsernameFromToken方法用于从Jwts中获取用户名,getExpirationDateFromToken方法用于从Jwts中获取过期时间,validateToken方法用于验证Jwts是否有效。其中,secret表示密钥,expiration表示过期时间,可以在配置文件中配置。例如,在application.properties文件中添加如下配置:
```
jwt.secret=secretkey
jwt.expiration=86400
```
在代码中,可以通过注入JwtUtils来使用JwtUtils。例如:
```java
@RestController
public class UserController {
@Autowired
private JwtUtils jwtUtils;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest request) {
// 验证用户名和密码
UserDetails userDetails = userDetailsService.loadUserByUsername(request.getUsername());
if (!passwordEncoder.matches(request.getPassword(), userDetails.getPassword())) {
throw new BadCredentialsException("用户名或密码不正确");
}
// 生成Token
String token = jwtUtils.generateToken(userDetails);
// 返回Token
return ResponseEntity.ok(new LoginResponse(token));
}
@GetMapping("/profile")
public ResponseEntity<?> getProfile(@RequestHeader("Authorization") String authHeader) {
String token = authHeader.substring(7); // 去掉"Bearer "前缀
String username = jwtUtils.getUsernameFromToken(token);
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
return ResponseEntity.ok(userDetails);
}
}
```
在上面的代码中,login方法用于登录并生成Token,getProfile方法用于获取用户信息。其中,authHeader表示请求头中的Authorization字段,格式为"Bearer Token"。可以通过substring方法去掉"Bearer "前缀,然后使用JwtUtils来解析Token并获取用户名。
阅读全文