Java的JTW单点登录的实现
时间: 2024-05-07 14:22:46 浏览: 11
JWT(JSON Web Token)是一种轻量级的身份验证和授权机制,可以在不需要服务器存储用户状态的情况下实现用户认证。下面是基于Java实现JWT单点登录的步骤:
1. 添加依赖
添加以下依赖到你的Maven或Gradle项目中:
Maven:
```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>
```
Gradle:
```groovy
implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.2'
```
2. 创建JWT工具类
创建一个JWT工具类,用于生成和解析JWT。可以参考以下代码:
```java
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtils {
private static final String SECRET_KEY = "your-secret-key"; // 需要替换成自己的密钥
private static final long EXPIRATION_TIME = 86400000L; // 过期时间为24小时
public static String generateToken(String username) {
Date now = new Date();
Date expiration = new Date(now.getTime() + EXPIRATION_TIME);
return Jwts.builder()
.setSubject(username)
.setIssuedAt(now)
.setExpiration(expiration)
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public static String getUsernameFromToken(String token) {
Claims claims = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
return claims.getSubject();
}
}
```
3. 实现单点登录
在用户登录成功后,生成JWT并将其存储在Cookie或Header中。以下是一个基于Cookie的实现示例:
```java
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginController {
public void login(HttpServletRequest request, HttpServletResponse response) {
// 登录验证
// ...
String username = "your-username"; // 需要替换成实际登录的用户名
// 生成JWT
String token = JwtUtils.generateToken(username);
// 存储JWT到Cookie中
Cookie cookie = new Cookie("jwt", token);
cookie.setMaxAge((int) JwtUtils.EXPIRATION_TIME / 1000);
cookie.setPath("/");
response.addCookie(cookie);
}
}
```
4. 验证JWT
在需要验证用户身份的接口中,从Cookie或Header中获取JWT,并解析出其中的用户名。以下是一个基于Cookie的实现示例:
```java
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
public class UserController {
public void getUser(HttpServletRequest request) {
// 从Cookie中获取JWT
Cookie[] cookies = request.getCookies();
String token = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("jwt".equals(cookie.getName())) {
token = cookie.getValue();
break;
}
}
}
if (token == null) {
// 用户未登录
// ...
} else {
try {
// 验证JWT并获取用户名
String username = JwtUtils.getUsernameFromToken(token);
// 根据用户名获取用户信息
// ...
} catch (Exception e) {
// JWT验证失败
// ...
}
}
}
}
```
以上就是基于Java实现JWT单点登录的步骤。需要注意的是,为了保证安全性,需要定期更换密钥并将过期时间设置得足够短。