SpringBoot登录退出|苍穹外卖登录退出分析

2024-09-08 04:12

本文主要是介绍SpringBoot登录退出|苍穹外卖登录退出分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 概要
    • 整体流程
    • 注意事项
      • 一、拦截路径
      • 二、token
      • 三、注册防止用户重复提交
    • 苍穹外卖登录退出分析
      • 注意
      • 解决JWT退出后依然有效的问题

概要

结合Spring Boot和Vue3实现安全的用户登录退出功能,并使用拦截器、JWT和Redis缓存来提高系统的安全性和性能。

整体流程

在这里插入图片描述

注意事项

一、拦截路径

像登录页面的路径就不要拦截了,否则都不能登录了

例如:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {@Autowiredprivate JwtTokenapiInterceptor jwtTokenapiInterceptor;/*** 注册自定义拦截器*/protected void addInterceptors(InterceptorRegistry registry) {// 添加拦截器  // 添加拦截路径  排除拦截路径registry.addInterceptor(jwtTokenapiInterceptor).addPathPatterns("/api/**").excludePathPatterns("/api/employee/login"); // 不拦截登录的接口}
}

二、token

  1. 用户登录验证密码等通过后,生成token,token中可存用户id,并存入redis(将token存储到redis中,便于管理token的状态和生命周期)。
  2. 下次请求拦截器先拦截,解析token中的用户id,然后从redis里面读取token验证,验证用户合法性。
  3. 退出登录,前端发一个请求给后端,删除redis中的token。

注意:

  • 不要将敏感信息(如密码)放在token中。
  • 妥善保管用于生成和验证token的密钥。

三、注册防止用户重复提交

我自己写了一个小demo,邮箱注册登录。

发送验证码,可能不小心点了两下等重复提交操作。解决方法:用redis

其他方法:
记录发送时间戳:后端可以记录每个用户发送验证码的时间戳。如果用户在短时间内发送多次验证码请求,后端可以检查最新的请求时间戳与上次请求时间戳的间隔,如果间隔时间太短,就拒绝处理额外的请求
前端限制:在前端实现点击发送验证码按钮后,禁用按钮一段时间,防止用户连续点击发送。可以在发送验证码后,将按钮禁用一段时间,以防止用户误操作多次点击发送。

苍穹外卖登录退出分析

定义拦截器:
在这里插入图片描述

注册拦截器:

在这里插入图片描述

用户登录:
用户提交登录请求➡️后端认证用户(拦截器会放行登录接口,先判断用户名密码,然后生成token)➡️生成令牌token,并将其返回给客户端

@PostMapping("/login")
public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {log.info("员工登录:{}", employeeLoginDTO);Employee employee = employeeService.login(employeeLoginDTO);// 登录成功后,生成jwt令牌Map<String, Object> claims = new HashMap<>();// token中存入用户idclaims.put(JwtClaimsConstant.EMP_ID, employee.getId());String token = JwtUtil.createJWT(jwtProperties.getAdminSecretKey(),jwtProperties.getAdminTtl(),claims);EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder().id(employee.getId()).userName(employee.getUsername()).name(employee.getName()).token(token).build();return Result.success(employeeLoginVO);
}

用户退出:

 @PostMapping("/logout")public Result<String> logout() {return Result.success();}

看看前端代码:
在这里插入图片描述

登录成功之后会把token存入本地cookie。
在这里插入图片描述
之后的请求,会使用axios的拦截器为每个请求的headers添加一个token,后端拦截器根据此token用于身份验证。

// 部分代码
if (UserModule.token) {config.headers['token'] = UserModule.token
} else if (UserModule.token && config.url != '/login') {window.location.href = '/login'return false
}

注意

如果苍穹的 Token 仅依靠 JWT 进行验证,而不通过 Redis 校验,那么退出实际上是伪退出。你可以复制退出前的 Token,退出登录后再将其粘贴到请求头中,依然可以继续使用。前端发起退出操作请求,清除本地Cookie存储的 Token,后端接收到请求后直接返回成功。让登录失效的关键在于前端,而不是后端。JWT 的过期时间在生成时就已经确定,后端无法动态更改。因此,Token 本身并没有立即失效,退出只是前端移除它了,Token 依然有效。
在这里插入图片描述

解决JWT退出后依然有效的问题

  1. 将Token存储到Redis中并进行验证。在每次请求时校验Redis中的Token是否有效。当用户退出时,从Redis中删除该Token
  2. 使用双Token机制(Access Token + Refresh Token)

❤觉得有用的可以留个关注ya~❤

这篇关于SpringBoot登录退出|苍穹外卖登录退出分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147078

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有