|
|
|
@ -0,0 +1,71 @@
|
|
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* https://www.mall4j.com/
|
|
|
|
|
*
|
|
|
|
|
* 未经允许,不可做商业用途!
|
|
|
|
|
*
|
|
|
|
|
* 版权所有,侵权必究!
|
|
|
|
|
*/
|
|
|
|
|
package com.yami.shop.security.common.controller;
|
|
|
|
|
|
|
|
|
|
// 导入Hutool工具库中用于字符串操作的工具类,此处用于判断字符串是否为空(空白字符串),方便进行逻辑判断
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
// 导入项目自定义的用于封装服务器响应信息的实体类,包含响应状态码、消息、数据等内容,用于统一向客户端返回响应结果,此处响应数据为Void表示无具体数据返回
|
|
|
|
|
import com.yami.shop.common.response.ServerResponseEntity;
|
|
|
|
|
// 导入与安全相关的用于管理Token存储和操作的类,负责对Token进行删除等相关管理操作,此处用于删除用户的登录Token
|
|
|
|
|
import com.yami.shop.security.common.manager.TokenStore;
|
|
|
|
|
// 导入Swagger相关的注解,用于生成API文档,@Operation注解用于描述接口的功能摘要和详细信息,方便前端开发人员等查看接口的作用和使用方式
|
|
|
|
|
import io.swagger.v3.oas.annotations.Operation;
|
|
|
|
|
// 导入Swagger相关的注解,用于给接口分类添加标签,方便文档中进行分组展示和说明,此处标记为"注销"类别
|
|
|
|
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
|
|
|
// 导入Spring框架用于实现依赖注入的注解,表明后续的属性需要由Spring容器进行注入实例化,此处用于注入TokenStore实例
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
// 导入Spring框架用于定义处理POST请求的注解,将下面的方法映射为一个接收POST请求的接口,处理对应的业务逻辑,即处理用户退出登录的请求
|
|
|
|
|
import org.springframework.web.bind.annotation.PostMapping;
|
|
|
|
|
// 导入Spring框架用于将类标记为RESTful风格的控制器的注解,表明该类中的方法主要用于处理HTTP请求并返回JSON等格式的响应数据
|
|
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
|
|
|
|
|
// 导入Servlet相关的用于操作HTTP请求的类,用于获取请求头中的信息,此处主要用于获取包含Token的"Authorization"请求头内容
|
|
|
|
|
import jakarta.servlet.http.HttpServletRequest;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* LogoutController类是一个Spring RESTful风格的控制器类,主要负责处理用户退出登录相关的业务逻辑,
|
|
|
|
|
* 通过接收客户端发送的退出登录请求,获取请求头中的Token信息(如果存在),然后调用相关的Token管理组件(TokenStore)删除对应的Token,
|
|
|
|
|
* 实现清除用户登录状态以及可能相关的缓存(如菜单缓存等,具体依赖于业务实现)的功能,同时使用Swagger注解生成相关的API文档,便于接口的查看和使用说明。
|
|
|
|
|
*
|
|
|
|
|
* @author 菠萝凤梨
|
|
|
|
|
* @date 2022/3/25 17:33
|
|
|
|
|
*/
|
|
|
|
|
@RestController
|
|
|
|
|
@Tag(name = "注销")
|
|
|
|
|
public class LogoutController {
|
|
|
|
|
|
|
|
|
|
// 通过Spring的依赖注入机制,注入一个TokenStore实例,用于管理Token的删除等相关操作,以实现清除用户登录Token的功能
|
|
|
|
|
@Autowired
|
|
|
|
|
private TokenStore tokenStore;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理用户退出登录请求的接口方法,接收客户端发送的HTTP请求(通过HttpServletRequest对象获取请求相关信息),
|
|
|
|
|
* 首先尝试从请求头中获取名为"Authorization"的Token信息,如果获取到的Token信息为空(空白字符串),
|
|
|
|
|
* 则直接返回成功的服务器响应实体,表示可以直接视为已退出登录(可能本身就没有有效的登录状态);
|
|
|
|
|
* 如果获取到了Token信息,则调用TokenStore的方法删除该用户对应的当前Token,然后返回成功的服务器响应实体,告知客户端已成功退出登录。
|
|
|
|
|
*
|
|
|
|
|
* @param request 包含客户端发送的退出登录请求相关信息的HttpServletRequest对象,用于获取请求头中的Token信息等操作
|
|
|
|
|
* @return ServerResponseEntity<Void> 返回一个服务器响应实体,响应数据类型为Void表示无具体数据返回,若成功退出登录则状态码为成功状态;若出现异常等情况,相关的异常处理机制会在更上层进行处理并返回合适的错误响应
|
|
|
|
|
*/
|
|
|
|
|
@PostMapping("/logOut")
|
|
|
|
|
@Operation(summary = "退出登陆", description = "点击退出登陆,清除token,清除菜单缓存")
|
|
|
|
|
public ServerResponseEntity<Void> logOut(HttpServletRequest request) {
|
|
|
|
|
// 从请求头中获取名为"Authorization"的Token信息,通常在登录成功后,客户端会在后续请求的这个请求头中携带Token用于身份验证等操作
|
|
|
|
|
String accessToken = request.getHeader("Authorization");
|
|
|
|
|
// 通过Hutool工具类判断获取到的Token信息是否为空(空白字符串),如果为空则直接返回成功的服务器响应实体,表示可视为已退出登录(可能本身就没登录)
|
|
|
|
|
if (StrUtil.isBlank(accessToken)) {
|
|
|
|
|
return ServerResponseEntity.success();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果获取到了有效的Token信息,则调用注入的TokenStore实例的方法,删除该用户在当前系统对应的Token,实现清除登录状态的功能
|
|
|
|
|
tokenStore.deleteCurrentToken(accessToken);
|
|
|
|
|
return ServerResponseEntity.success();
|
|
|
|
|
}
|
|
|
|
|
}
|