From 60df001385ee60a9411ea8ab1737daf29832cd6d Mon Sep 17 00:00:00 2001 From: KilLze Date: Fri, 2 Jan 2026 12:46:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=80=80=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=AE=9E=E7=8E=B0=20=E7=94=A8=E6=88=B7=E9=80=80?= =?UTF-8?q?=E5=87=BA=E5=B0=86Redis=E7=9A=84token=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=B0=E9=BB=91=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bao/dating/controller/UserController.java | 14 +++++++++ .../dating/interceptor/TokenInterceptor.java | 10 +++++++ .../com/bao/dating/service/UserService.java | 7 +++++ .../dating/service/impl/UserServiceImpl.java | 29 ++++++++++++++++--- 4 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/bao/dating/controller/UserController.java b/src/main/java/com/bao/dating/controller/UserController.java index 78e0e9e..aad6328 100644 --- a/src/main/java/com/bao/dating/controller/UserController.java +++ b/src/main/java/com/bao/dating/controller/UserController.java @@ -9,10 +9,13 @@ import com.bao.dating.pojo.dto.UserLoginDTO; import com.bao.dating.pojo.vo.UserInfoVO; import com.bao.dating.pojo.vo.UserLoginVO; import com.bao.dating.service.UserService; +import io.jsonwebtoken.Jwt; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; + /** * 用户接口 * @@ -35,6 +38,17 @@ public class UserController { return Result.success(ResultCode.SUCCESS, "登录成功", userloginVO); } + /** + * 退出登录 + * 从请求头中获取token并将其加入黑名单 + */ + @PostMapping("/logout") + public Result logout(HttpServletRequest request) { + String token = request.getHeader("token"); + userService.logout(token); + return Result.success(ResultCode.SUCCESS,"退出登录成功",null); + } + /** * 获取用户信息 * @return 用户信息 diff --git a/src/main/java/com/bao/dating/interceptor/TokenInterceptor.java b/src/main/java/com/bao/dating/interceptor/TokenInterceptor.java index d5f0780..29cb530 100644 --- a/src/main/java/com/bao/dating/interceptor/TokenInterceptor.java +++ b/src/main/java/com/bao/dating/interceptor/TokenInterceptor.java @@ -56,6 +56,16 @@ public class TokenInterceptor implements HandlerInterceptor { response.getWriter().write("Token无效或已过期"); return false; } + + // 检查 token 是否在黑名单中 + Object blacklistToken = redisTemplate.opsForValue().get("jwt:blacklist:" + token); + if (blacklistToken != null) { + log.error("Token已在黑名单中"); + response.setStatus(401); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write("登录已失效, 请重新登录"); + return false; + } // 解析 token String userId = JwtUtil.getSubjectFromToken(token); diff --git a/src/main/java/com/bao/dating/service/UserService.java b/src/main/java/com/bao/dating/service/UserService.java index 5705ceb..8dd074c 100644 --- a/src/main/java/com/bao/dating/service/UserService.java +++ b/src/main/java/com/bao/dating/service/UserService.java @@ -18,6 +18,13 @@ public interface UserService { */ UserLoginVO userLogin(UserLoginDTO userLoginDTO); + /** + * 退出登录 + * @param token 登录凭证 + * @return 注册结果 + */ + void logout(String token); + /** * 查询个人信息 * @param userId 动态ID diff --git a/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java b/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java index 2a0f47d..189b7e3 100644 --- a/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java +++ b/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java @@ -17,6 +17,7 @@ import com.bao.dating.service.UserService; import com.bao.dating.util.FileUtil; import com.bao.dating.util.JwtUtil; import com.bao.dating.util.MD5Util; +import io.jsonwebtoken.Claims; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -25,10 +26,7 @@ import org.springframework.web.multipart.MultipartFile; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.concurrent.TimeUnit; /** @@ -99,6 +97,29 @@ public class UserServiceImpl implements UserService { return userLoginVO; } + /** + * 退出登录 + * @param token 登录凭证 + */ + @Override + public void logout(String token) { + Claims claims = JwtUtil.getClaimsFromToken(token); + Date expiration = claims.getExpiration(); + // 判断 token 是否已过期 + long ttl = expiration.getTime() - System.currentTimeMillis(); + // 如果 token 已过期,则不用处理 + if (ttl <= 0) { + return; + } + + String logoutKey = "jwt:blacklist:" + token; + redisTemplate.opsForValue().set( + logoutKey, + "logout", + ttl, + TimeUnit.MILLISECONDS); + } + /** * 获取用户信息 *