token登陆验证

article/2025/10/10 1:58:13

登陆业务的实现
由于http是无状态的,那么应该如何记住登录状态呢?
单一应用的服务中常见做法是在客户端cookie中保存sessionId,服务器端的session中保存sessionid,每次客户端发送请求的时候都带上sessionid,在服务器端进行验证。

在分布式系统中,由于服务器之间不能共享内存,因此服务器之间session不能互通,因此不能使用session去存储用户的登录信息,一般使用token方式去记录登录状态。token方式其实也和前面的方式大同小异,区别就是使用Redis缓存去存储这个用户标识。
在这里插入图片描述
token进行登录验证的步骤如下
(1)客户端输入用户名和密码向服务器端发起验证
(2)服务器端验证通过之后根据某种规则生成用户的token并返回,这个token保存在redis中,以保证不同服务器间的共享
(3)客户端存储该token,可以存储在sessionStorage或者cookie中
(4)后续服务器的每次请求都在请求头携带token发送到服务端
(5)服务端在执行方法前先对请求进行验证,取出token查询redis中有没有对应的值。
在这里插入图片描述
前端使用的技术
前端框架使用vue.js,用到的关键技术有路由导航守卫和拦截器
路由导航守卫主要是保证没有获得token时不能访问除登录外的其他页面,这里不对token进行验证,只是判断token存不存在
拦截器主要目的是让请求头携带token
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
后端使用的技术
后端框架使用springboot
使用到的关键技术主要是Redis,AOP以及拦截器

以下的方法主要是生成token,并把token存在redis中

@RestController
@RequestMapping("/seller/user")
@CrossOrigin
public class SellerUserController {@Autowiredprivate LoginService loginService;@Autowiredprivate StringRedisTemplate redisTemplate;@PostMapping("/login")public ResultVO login(@RequestBody LoginForm loginForm){SellerInfo sellerInfo=loginService.getSellerInfo(loginForm.getUsername(),loginForm.getPassword());UserVO userVo=new UserVO();//生成tokenif(sellerInfo!=null){String token = UUID.randomUUID().toString();userVo.setUsername(sellerInfo.getUsername());userVo.setToken(token);//设置token到redisInteger expire= RedisConstant.EXPIRE;redisTemplate.opsForValue().set(String.format(RedisConstant.TOKEN_PREFIX,token),sellerInfo.getUsername(),expire,TimeUnit.SECONDS);return ResultUtils.success(userVo);}return ResultUtils.fail(userVo);}}
public interface RedisConstant {String TOKEN_PREFIX ="token_%s";Integer EXPIRE =1800;
}

接下来的问题是如何在每个请求过来的时候都验证token,不可能对每一个Controller都加入验证token的方法,比较容易想到的方式是使用AOP编程

切入点就是Controller中执行对应业务的方法
然后在执行方法之前,从请求头中拿到token,然后在redis中查询这个token是否有对应的值,如果有就验证通过,没有就验证失败,然后抛出异常。

@Aspect
@Component
public class SellerAuthorizeAspect {@Autowiredprivate StringRedisTemplate redisTemplate;@Pointcut("execution(public * com.pers.food.controller.Seller*.*(..)) && !execution(public * com.pers.food.controller.SellerUserController.*(..))")public void verify(){}@Before("verify()")public void doverify(){ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();//从http请求头中拿到tokenString token=request.getHeader("Authorization");if(token==null){throw new UserException(ResultEnum.LOGIN_STATE_ERROR);}String tokenValue= redisTemplate.opsForValue().get(String.format(RedisConstant.TOKEN_PREFIX,token));if(StringUtils.isEmpty(tokenValue)){throw new UserException(ResultEnum.TOKEN_NOT_FOUND);}redisTemplate.opsForValue().set(String.format(RedisConstant.TOKEN_PREFIX,token),tokenValue,RedisConstant.EXPIRE, TimeUnit.SECONDS);}
}

使用@ControllerAdvice处理异常,出现异常就给前端返回错误码,前端再用拦截器处理,如果收到错误码就跳转回登录页面。

@ControllerAdvice
public class SellExceptionHandler {//拦截登陆异常@ExceptionHandler(value=UserException.class)@ResponseBodypublic ResultVO handleLoginExcpetion(){return ResultUtils.authorizeFail();}
}

http://chatgpt.dhexx.cn/article/1VoZGsjO.shtml

相关文章

登录界面的验证

用html、css、js做一个简单的登录界面的验证 做一个登录界面验证 用户名不允许为空 密码为6-16位数字 邮箱要用email格式 手机号必须1开头且为11位数 地址必须填写 必须勾选同意协议才可以提交 css 用户名框验证如下 var flag true;if(name.length<1){$(msgName).innerT…

登录页面验证

页面组件 登录页 <template><div><p>用户名&#xff1a;<input type"text" v-model"userName" /></p><p>密码&#xff1a;<input type"text" v-model"passWord" /></p><button …

JavaScript登录验证

要求 账号&#xff1a;3-15位并且不能数字开头 密码&#xff1a;6-18位并且不能全是数字或者全是字符 页面代码 <body> <form><label>用户名:</label><input type"text" id"userName" name"userName" placeholder…

用户登陆验证

我们在操作各种软件的过程中&#xff0c;都涉及“用户登陆”的操作。例如登陆QQ、微信等软件&#xff0c;都需要用户名和密码的验证。 现在我们要开发一个图书馆管理系统&#xff0c;系统需要一个登陆的功能&#xff0c;我们应该怎么样实现用户登陆的验证功能&#xff1f; 我们…

Web 登录验证

前言&#xff1a;Web 用户的身份验证&#xff0c;及页面操作权限验证是B/S系统的基础功能&#xff0c;一个功能复杂的业务应用系统&#xff0c;通过角色授权来控制用户访问&#xff0c;本文通过Form认证&#xff0c;Mvc的Controller基类及Action的权限验证来实现Web系统登录&am…

如何实现验证登录

开发工具与关键技术&#xff1a;VS .MVC基础 作者&#xff1a;卢雅婷 撰写时间&#xff1a;2019/05/6 &#xff08;代码来源于老师&#xff09; 实现验证登录这个操作是一些软件使用前的操作&#xff0c;第一步是注册&#xff0c;再就是登陆软件&#xff0c;&#xff08;比喻微…

实现登录验证

最近练习搭建了一个后台管理系统,首先第一步做了关于验证登录的功能.以下项目使用了Nacos作为服务发现和注册中心,将Auth和gateway,system等相关多个微服务注册进Nacos.每次刷新登录页面,就会获取新的验证码(,输入正确的验证码即可成功跳转至首页. 获取验证码url:http://localh…

【图解】用户登录验证流程,这下彻底搞懂了!

开发者&#xff08;KaiFaX&#xff09; 面向全栈工程师的开发者 专注于前端、Java/Python/Go/PHP的技术社区 本文通过图示及代码的方式介绍用户登录流程及技术实现&#xff0c;内容包括用户登录&#xff0c;用户验证&#xff0c;如何获取操作用户的信息以及一些黑名单及匿名接口…

前端应该掌握的登录认证知识

1 背景 前一段时间&#xff0c;参与了老项目的迁移工作&#xff0c;配合后端接口迁移时&#xff0c;由于两个项目采取了不一样的登陆方案&#xff0c;所以遇到了跨域登录态无法共享的问题。经过各方协调&#xff0c;最终老项目将迁移页面部署在新项目的指定网关下&#xff0c;…

中间件登录验证(白名单,黑名单)

中间件版的登录验证需要依靠session&#xff0c;所以数据库中要有django_session表。 urls.py from django.conf.urls import url from app01 import viewsurlpatterns [url(r^index/$, views.index),url(r^login/$, views.login, namelogin), ]urls.py View Code views.py fr…

登录验证的那些事儿

前言 在以前的项目我们一般使用session或者cookie来存储已登录的用户信息&#xff0c;这样到达一个免除重复登录的问题&#xff0c;那么如何登录&#xff0c;又如何验证&#xff0c;就是一直在讨论的问题。今天我们对这些技术点进行一个梳理。 字 多 你 就 挑 有 颜 色 的 看…

计算机网络-(自顶向下方法)

计算机网络基础知识概述 计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不同的&#xff0c;两者需要进行通信&#xff0c;必须要在一定的标准上进行。 …

计算机网络:自顶向下方法 笔记

计算机网络&#xff1a;自顶向下方法 笔记 综述因特网部件图例交换方式分组交换电路交换频分复用时分复用 对比 五层/七协议一个传输实例攻击DOS攻击 应用层应用程序结构客户-服务器结构P2P point2point结构 应用层协议总览http报文格式http状态码cookiesessionhttps FTPSMTPDN…

计算机网络 自顶向下 笔记

目录 第一章 计算机网络和因特网 全书答案评论留言即可 我私发&#xff0c;这里上传不了文本 第一章 计算机网络和因特网 什么是因特网&#xff1f; 因特网的具体构成&#xff1a;构成因特网的基本硬件和软件组件 分布式应用的互联网基础设施来描述 ---------------------…

《计算机网络-自顶向下》04. 网络层-数据平面

文章目录 网络层数据平面和控制平面两者的概述数据平面控制平面 控制平面&#xff1a;传统方法控制平面&#xff1a;SDN 方法网络服务模型 路由器工作原理通用路由器体系结构输入端口的功能基于目标的转发 交换结构内存交换方式总线交换方式纵横式交换方式 输出端口的功能何时何…

计算机网络自顶向下方法 习题参考答案 第一章

复习题&#xff1a; R1. 没有什么不同。PC、服务器、手机等。Web服务器是端系统。 R2. Protocol is commonly described as a set of international courtesy rules. These well-established and time-honored rules have made it easier for nations and people to live a…

计算机网络自顶向下方法(第六版) 课后题答案 | 第三章

复习题 R1. a. 将此协议称为简单传输协议(STP)。在发送方端&#xff0c;STP 从发送过程中接收不超过 1196 字节的数据块、目标主机地址和目标端口号。STP 向每个块添加一个 4 字节的报头&#xff0c;并将目标进程的端口号放在这个报头中。然后 STP 将目标主机地址和报文段提供…

计算机网络—自顶向下 计算机网络和因特网

目录 1. 什么是计算机网络 1.1 概念 1.2 因特网的具体构成 2. 计算机网络的结构 2.1 网络边缘(The Network Edge) 2.1.1 接入网 2.1.2 物理媒体 2. 2 网络核心(The network core) 2.2.1 电路交换 2.2.2 多路复用 2.2.3 报文交换 2.2.4 分组交换 2.2.5 网络之…

计算机网络自顶向下方法(一)——计算机网络和因特网

不要成为理想的巨人&#xff0c;行动的矮子 文章目录 写在前面什么是Internet?具体构成及描述什么是Internet: 从服务角度 网络边缘网络边缘&#xff1a;采用网络设施的面向连接服务网络边缘&#xff1a;采用基础设施的无连接服务 网络核心网络核心&#xff1a;电路交换电路交…

【计算机网络:自顶向下方法】(二)应用层

tm 【计算机网络&#xff1a;自顶向下方法】(二)应用层 文章目录 应用层如何创建一个新的网络应用? 2.1 应用层原理网络应用的体系结构对等模式(P2P:Peer To Peer)混合体&#xff1a;客户-服务器和对等体系结构 进程通信分布式进程通信需要解决的问题问题1&#xff1a;…