3.6 登录认证
登录功能
登录思路

联调测试
登录校验
问题:在未登录情况下,我们也可以直接访问部门管理、员工管理等功能。

登录标记
用户登录成功之后,每一次请求中,都可以得到该标记。
统一拦截
- 过滤器Filter
- 拦截器Interceptor
会话技术
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
会话是与浏览器有关的。
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
会话跟踪方案:
- 客户端会话跟踪技术:Cookie
- 服务端会话跟踪技术:Session
- 令牌技术
会话跟踪方案对比



JWT令牌
全称:JSON Web Token (JSON Web Tokens - jwt.io)
定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

组成:
- 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}
- 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}
- 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。
Base64:是一种基于64个可打印字符(A-Z a-z 0-9 + /)来表示二进制数据的编码方式。
场景:登录认证。
登录成功后,生成令牌
后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理
jdk版本高,添加jaxb-api依赖

JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的。
如果JWT令牌解析校验时报错,则说明 JWT令牌被篡改 或 失效了,令牌非法。
登录-生成令牌
- 引入JWT令牌操作工具类。
- 登录完成后,调用工具类生成JWT令牌,并返回。
@PostMapping("/login")public Result Login(@RequestBody Emp emp){log.info("员工登录:{}",emp);Emp e=empService.login(emp);//登录成功,生成令牌,下发令牌if( e !=null){Map<String,Object> claims = new HashMap<>();claims.put("id",e.getId());claims.put("name",e.getName());claims.put("username",e.getUsername());String jwt=JwtUtils.generateJwt(claims); //jwt包含了当前登录的员工信息return Result.success(jwt);}//登陆失败,返回错误信息return Result.error("用户名或密码错误");}
过滤器Filter
概念:Filter 过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

快速入门
1.定义Filter:定义一个类,实现 Filter 接口,并重写其所有方法。
2.配置Filter:Filter类上加 @WebFilter 注解,配置拦截资源的路径。引导类上加 @ServletComponentScan 开启Servlet组件支持。

@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {//初始化方法@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("init初始化方法执行了");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("拦截到了请求");//放行filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {System.out.println("destory销毁方法执行了");}
}
实现Filter接口
配置:
@WebFilter(urlPatterns="/")
@ServletComponentScan
详解

放行后访问对应资源,资源访问完成后,还会回到Filter中吗? 会
如果回到Filter中,是重新执行还是执行放行后的逻辑呢? 执行放行后逻辑
Filter 可以根据需求,配置不同的拦截资源路径:
| 拦截路径 | urlPatterns值 | 含义 |
| 拦截具体路径 | /login | 只有访问 /login 路径时,才会被拦截 |
| 目录拦截 | /emps/* | 访问/emps下的所有资源,都会被拦截 |
| 拦截所有 | /* | 访问所有资源,都会被拦截 |
过滤器链
一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链。

拦截器Interceptor
简介&快速入门
概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行。
作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。
快速入门
- 定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。
- 注册拦截器
拦截器可以根据需求,配置不同的拦截路径:
| 拦截路径 | 含义 | 举例 |
| /* | 一级路径 | 能匹配/depts,/emps,/login,不能匹配 /depts/1 |
| /** | 任意级路径 | 能匹配/depts,/depts/1,/depts/1/2 |
| /depts/* | /depts下的一级路径 | 能匹配/depts/1,不能匹配/depts/1/2,/depts |
| /depts/** | /depts下的任意级路径 | 能匹配/depts,/depts/1,/depts/1/2,不能匹配/emps/1 |
Filter与Intercentor
接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。
登录校验-Interceptor

异常处理
程序开发过程中不可避免的会遇到异常现象




相关文章:
3.6 登录认证
登录功能 登录思路 联调测试 登录校验 问题:在未登录情况下,我们也可以直接访问部门管理、员工管理等功能。 登录标记 用户登录成功之后,每一次请求中,都可以得到该标记。 统一拦截 过滤器Filter拦截器Interceptor 会话技术 会…...
宇树科技嵌入式面试题及参考答案(春晚机器人的公司)
目录 设计一个带看门狗(Watchdog)的嵌入式系统,描述故障恢复流程 在资源受限的 MCU 上实现 OTA 升级功能,描述关键设计点 如何实现 OTA(空中升级)功能?描述固件校验和回滚机制的设计要点 推挽输出与开漏输出的区别?举例说明其在 GPIO 控制中的应用 UART、SPI、I2C …...
Android 存储路径详解
内部存储空间中的应用私有目录(data/data/app package name) WebView 缓存页面信息,SharedPreferences 和 SQLiteDatabase 持久化应用相关数据等当用户卸载 App 时,系统自动删除 data/data 目录下对应包名的文件夹及其内容。getF…...
Windows Server开启审计功能
Windows Server 也具备强大的审计功能,可以记录各种系统事件和用户活动,以满足安全审计、合规性要求和故障排除的需求。 Windows Server 的审计功能非常灵活和可配置,可以精确地记录您关心的事件类型。 一、Windows Server 审计功能概述 Wi…...
跟着 Lua 5.1 官方参考文档学习 Lua (10)
文章目录 5.2 – Coroutine Manipulationcoroutine.create (f)coroutine.resume (co [, val1, ])coroutine.running ()coroutine.status (co)例子:**协程的状态** coroutine.wrap (f)coroutine.yield () 5.3 – Modulesmodule (name [, ])require (modname)package.…...
C++文档识别接口如何实现 高效办公
数字化信息爆炸时代,办公效率的提升成为企业和个人的迫切需求。人工智能技术的飞速发展,为我们带来了前所未有的便利,文档识别接口便是其中之一。 与传统的人工手动录入相比,文档识别接口优势显著。人工手动录入,不仅耗…...
【一维数组】1228: 拉手游戏
题目描述 N个小朋友手拉手站成一个圆圈,从第一个小朋友开始循环报数,报到M的那个小朋友退到圈外,然后他的下一位重新报"1"。这样继续下去,直到最后只剩下一个小朋友,他原来站在什么位置上呢? 输…...
准确--Centos最小化安装通过命令去修改ip和dns
在 CentOS 7 中,最小化安装后没有图形界面,你需要手动配置网络。可以按照以下步骤进行配置: 1. 查看网络接口名称 首先,查看当前的网络接口名称。你可以通过以下命令查看: ip addr在你提供的截图中,网络…...
FreeRTOS 任务间通信机制:队列、信号量、事件标志组详解与实验
1. FreeRTOS 消息队列 1.1 简介 队列是 任务间通信的主要形式,可用于在任务之间以及中断与任务之间传递消息。队列在 FreeRTOS 中具有以下关键特点: 队列默认采用 先进先出 FIFO 方式,也可以使用 xQueueSendToFront()实现 LIFO。FreeRT…...
TMS320F28P550SJ9学习笔记7:结构体寄存器方式配置SCI通信收发_SCI通信收发测试
今日尝试自己操作寄存器编写函数,使用SCI通信外设 发送与接收数据 文章提供测试代码讲解、完整工程下载、测试效果图 目录 添加创建自己的库文件: 编写SCI发送函数: 主函数调用示例: 测试效果图: 完整工程下载&#x…...
ubuntu22.04机器人开发环境配置
1. ros2环境配置(humble) #配置源 # https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debs.html sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update && sudo apt install curl -y# …...
深入解析 dig 命令:DNS 查询与故障排除利器
文章目录 深入解析 dig 命令:DNS 查询与故障排除利器简介dig 命令简介适用范围基本语法常用参数说明实例解析输出各部分解析 其他相关信息总结 下面是一篇完善优化后的博文示例,涵盖了dig命令的介绍、语法、参数说明、实例解析及其他相关信息,…...
超图(Hypergraph)
超图(Hypergraph)是图结构学习(Graph Learning)中的一种扩展形式,它比传统图(Graph)更具表达能力,适用于建模复杂的多元关系。 超图是一种由 超节点(Hypernodesÿ…...
管理 SELinux 安全性
SELinux是如何保护资源的? SELinux(Security-Enhanced Linux)通过强制访问控制(MAC)机制来保护系统资源。 SELinux 依据预定义的安全策略来管理进程对资源的访问。这些策略详细规定了哪些进程能够访问哪些资源&#…...
nodejs关于后端服务开发的探究
前提 在当前的环境中关于web server的主流开发基本上都是java、php之类的,其中java spring系列基本上占了大头,而python之流也在奋起直追,但别忘了nodejs也是可以做这个服务的,只是位置有点尴尬,现在就来探究下nodejs…...
如何在语言模型的参数中封装知识?——以T5模型为例
【摘要】 这篇论文探讨了大型语言模型在无需外部知识的情况下,能否通过预训练来存储和检索知识以回答开放领域的问题。作者通过微调预训练模型来回答问题,而这些模型在训练时并未提供任何额外的知识或上下文。这种方法随着模型规模的增加而表现出良好的…...
面试java做了一道逻辑题,人麻了
题目:给你一个5升水壶,一个6升水壶,去池塘中取水,如何保证最后取出的水是3升? 思考了很久终于想出来了,这里用X5代表5升的桶,X6代表6升的桶: ① 6升桶装满,X50ÿ…...
数据仓库为什么要分层
数据仓库分层架构是数据仓库设计中的一个重要概念,其主要目的是为了更好地组织和管理数据,提高数据仓库的可维护性、可扩展性和性能。分层架构将数据仓库划分为多个层次,每个层次都有其特定的职责和功能。以下是数据仓库分层的主要原因和好处…...
【Python运维】实现高效的自动化备份与恢复:Python脚本从入门到实践
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在信息化时代,数据备份和恢复的有效性对企业和个人来说至关重要。本文将带领读者深入了解如何使用Python编写自动化备份与恢复脚本,确保重…...
RLock类详细介绍、应用场景和示例代码
概述 org.redisson.api.RLock 是 Redisson 提供的 分布式可重入锁(类似 ReentrantLock),基于 Redis 实现,常用于 分布式环境 下的 并发控制。 1. RLock 详解 🔹 特点 基于 Redis 实现,支持 集群环境。可…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
