springboot jwt 禁止多点登入
时间: 2023-08-28 15:16:55 浏览: 126
要在Spring Boot中使用JWT实现禁止多点登录,可以结合JWT的过期时间和存储机制来实现。以下是一个简单示例:
1. 创建一个存储用户Token的类,如TokenStore:
```java
import java.util.HashMap;
import java.util.Map;
public class TokenStore {
private static Map<String, String> userTokenMap = new HashMap<>();
public static void addToken(String username, String token) {
userTokenMap.put(username, token);
}
public static void removeToken(String username) {
userTokenMap.remove(username);
}
public static boolean containsToken(String username) {
return userTokenMap.containsKey(username);
}
}
```
这个类用于存储每个用户的Token,可以根据实际情况将其替换为数据库或其他持久化存储。
2. 创建一个拦截器或过滤器来验证Token:
```java
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JwtInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取请求头中的Token
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7);
String username = JwtUtils.getUsernameFromToken(token);
// 验证Token是否有效
if (username != null && JwtUtils.validateToken(token, username)) {
// 检查是否已经存在有效的Token,如果存在则拒绝登录
if (TokenStore.containsToken(username)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
// 将Token存储到TokenStore中
TokenStore.addToken(username, token);
return true;
}
}
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
}
```
这个拦截器或过滤器用于验证Token的有效性,并检查是否已经存在有效的Token。如果存在,则拒绝登录;否则,将Token存储到TokenStore中。
3. 在Spring Boot的配置类中配置拦截器:
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private JwtInterceptor jwtInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login"); // 不拦截登录接口
}
}
```
在这个配置类中,将JwtInterceptor添加到拦截器列表中,并排除登录接口,以免拦截登录请求。
4. 创建一个登出接口:
```java
@RestController
public class LogoutController {
@PostMapping("/logout")
public void logout(HttpServletRequest request) {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7);
String username = JwtUtils.getUsernameFromToken(token);
// 将Token从TokenStore中移除
TokenStore.removeToken(username);
}
}
}
```
在这个接口中,从请求头中获取Token并解析出用户名,然后将Token从TokenStore中移除。
通过这种方式,当用户登录时,会检查是否已经存在有效的Token;如果存在,则拒绝登录;如果不存在,则生成新的Token并存储到TokenStore中。当用户登出时,会将Token从TokenStore中移除,这样就实现了禁止多点登录的功能。
阅读全文