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

相关文章

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Java中的JSONObject详解

《Java中的JSONObject详解》:本文主要介绍Java中的JSONObject详解,需要的朋友可以参考下... Java中的jsONObject详解一、引言在Java开发中,处理JSON数据是一种常见的需求。JSONObject是处理JSON对象的一个非常有用的类,它提供了一系列的API来操作J

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序