tokenMap.computeIfAbsent是什么方法用来做什么的
时间: 2024-02-09 18:50:05 浏览: 19
tokenMap.computeIfAbsent是一个Map接口中的方法,用于查找指定键对应的值,如果该键不存在,则可以将指定函数应用于该键,并将其返回值存储在Map中,并返回该值。其作用是在Map中根据指定的键查找对应的值,如果键不存在,则可以使用指定函数将其计算出来并存储到Map中,避免了重复计算和重复添加键值对的操作。
相关问题
tokenKey := global.RDb.HGet("key", "token", tokenMap["id"].(string)).Val() tokenKeys := strings.Split(tokenKey, "|") tokenIndex := -1 for k, v := range tokenKeys { if v == token { tokenIndex = k break } }
这是另一个代码片段,它的作用是从 Redis 数据库中读取一个键名为 "key",字段名为 "token",值为 tokenMap["id"].(string) 的哈希表项,并将其值赋给变量 tokenKey。接着,它将 tokenKey 字符串按照 "|" 分隔符进行切割,并赋值给变量 tokenKeys。然后,它遍历 tokenKeys 切片,查找其中是否包含 token 的值。如果找到了,就将其下标赋值给变量 tokenIndex。如果遍历完整个切片都没有找到,那么 tokenIndex 的值将保持为 -1。
这个代码片段的具体用途可能是在一个多设备登录的场景下,判断当前用户的访问令牌是否合法。它从 Redis 数据库中读取了一个哈希表项,该哈希表的键名为 "key",字段名为 "token",值为一个字符串。这个字符串可能包含多个设备的访问令牌,以 "|" 分隔符进行分割。然后,它遍历这些访问令牌,查找是否有与当前访问令牌相同的。如果有,就说明当前用户的访问令牌是有效的。
springboot用jwt实现token退出登录的代码
下面是使用 Spring Boot 和 JWT 实现退出登录的示例代码:
```java
@RestController
public class AuthController {
@Autowired
private JwtTokenUtil jwtTokenUtil;
@PostMapping("/logout")
public ResponseEntity<?> logout(HttpServletRequest request) {
// 获取请求头中的 token
String token = request.getHeader("Authorization").substring(7);
// 从 token 中获取用户名
String username = jwtTokenUtil.getUsernameFromToken(token);
// 清除该用户的 token
jwtTokenUtil.removeToken(username);
return ResponseEntity.ok("Logout success");
}
}
```
在上面的代码中,我们定义了一个 `AuthController` 类,其中有一个 `logout` 方法用于处理退出登录的请求。首先,我们从请求头中获取 token,并通过 JWT 工具类 `JwtTokenUtil` 解析出 token 中的用户名。然后,我们调用 `JwtTokenUtil` 的 `removeToken` 方法,将该用户的 token 从缓存中清除。
在 JWT 工具类中,我们需要实现 `removeToken` 方法,如下所示:
```java
@Component
public class JwtTokenUtil {
private static final Map<String, String> tokenMap = new ConcurrentHashMap<>();
// 其他代码省略...
public void removeToken(String username) {
tokenMap.remove(username);
}
}
```
在上面的代码中,我们使用了一个 `ConcurrentHashMap` 来缓存每个用户的 token,因此,我们可以通过调用 `removeToken` 方法,从缓存中清除指定用户的 token。当用户再次访问需要认证的接口时,由于其 token 已被删除,将会返回未授权的错误。