当前位置: 首页 > news >正文

3.6 登录认证

登录功能

登录思路

联调测试

登录校验

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

登录标记

用户登录成功之后,每一次请求中,都可以得到该标记。

统一拦截

  • 过滤器Filter
  • 拦截器Interceptor

会话技术

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

会话是与浏览器有关的。

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。

会话跟踪方案:

  • 客户端会话跟踪技术:Cookie
  • 服务端会话跟踪技术:Session
  • 令牌技术

会话跟踪方案对比

JWT令牌

全称:JSON  Web  TokenJSON Web Tokens - jwt.io

定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

组成:

  • 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}
  • 第二部分:Payload(有效载荷),携带一些自定义信息默认信息等。 例如:{"id":"1","username":"Tom"}
  • 第三部分:Signature(签名),防止Token被篡改、确保安全性。将headerpayload,并加入指定秘钥,通过指定签名算法计算而来。

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 三大组件(ServletFilterListener)之一。

过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

快速入门

1.定义Filter:定义一个类,实现 Filter 接口,并重写其所有方法。

2.配置FilterFilter类上加 @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框架中提供的,用来动态拦截控制器方法的执行。

作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

快速入门

  1. 定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。
  2. 注册拦截器

拦截器可以根据需求,配置不同的拦截路径:

拦截路径

含义

举例

/*

一级路径

能匹配/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 登录认证

登录功能 登录思路 联调测试 登录校验 问题&#xff1a;在未登录情况下&#xff0c;我们也可以直接访问部门管理、员工管理等功能。 登录标记 用户登录成功之后&#xff0c;每一次请求中&#xff0c;都可以得到该标记。 统一拦截 过滤器Filter拦截器Interceptor 会话技术 会…...

宇树科技嵌入式面试题及参考答案(春晚机器人的公司)

目录 设计一个带看门狗(Watchdog)的嵌入式系统,描述故障恢复流程 在资源受限的 MCU 上实现 OTA 升级功能,描述关键设计点 如何实现 OTA(空中升级)功能?描述固件校验和回滚机制的设计要点 推挽输出与开漏输出的区别?举例说明其在 GPIO 控制中的应用 UART、SPI、I2C …...

Android 存储路径详解

内部存储空间中的应用私有目录&#xff08;data/data/app package name&#xff09; WebView 缓存页面信息&#xff0c;SharedPreferences 和 SQLiteDatabase 持久化应用相关数据等当用户卸载 App 时&#xff0c;系统自动删除 data/data 目录下对应包名的文件夹及其内容。getF…...

Windows Server开启审计功能

Windows Server 也具备强大的审计功能&#xff0c;可以记录各种系统事件和用户活动&#xff0c;以满足安全审计、合规性要求和故障排除的需求。 Windows Server 的审计功能非常灵活和可配置&#xff0c;可以精确地记录您关心的事件类型。 一、Windows Server 审计功能概述 Wi…...

跟着 Lua 5.1 官方参考文档学习 Lua (10)

文章目录 5.2 – Coroutine Manipulationcoroutine.create (f)coroutine.resume (co [, val1, ])coroutine.running ()coroutine.status (co)例子&#xff1a;**协程的状态** coroutine.wrap (f)coroutine.yield () 5.3 – Modulesmodule (name [, ])require (modname)package.…...

C++文档识别接口如何实现 高效办公

数字化信息爆炸时代&#xff0c;办公效率的提升成为企业和个人的迫切需求。人工智能技术的飞速发展&#xff0c;为我们带来了前所未有的便利&#xff0c;文档识别接口便是其中之一。 与传统的人工手动录入相比&#xff0c;文档识别接口优势显著。人工手动录入&#xff0c;不仅耗…...

【一维数组】1228: 拉手游戏

题目描述 N个小朋友手拉手站成一个圆圈&#xff0c;从第一个小朋友开始循环报数&#xff0c;报到M的那个小朋友退到圈外&#xff0c;然后他的下一位重新报"1"。这样继续下去&#xff0c;直到最后只剩下一个小朋友&#xff0c;他原来站在什么位置上呢&#xff1f; 输…...

准确--Centos最小化安装通过命令去修改ip和dns

在 CentOS 7 中&#xff0c;最小化安装后没有图形界面&#xff0c;你需要手动配置网络。可以按照以下步骤进行配置&#xff1a; 1. 查看网络接口名称 首先&#xff0c;查看当前的网络接口名称。你可以通过以下命令查看&#xff1a; ip addr在你提供的截图中&#xff0c;网络…...

FreeRTOS 任务间通信机制:队列、信号量、事件标志组详解与实验

1. FreeRTOS 消息队列 1.1 简介 ​ 队列是 任务间通信的主要形式&#xff0c;可用于在任务之间以及中断与任务之间传递消息。队列在 FreeRTOS 中具有以下关键特点&#xff1a; 队列默认采用 先进先出 FIFO 方式&#xff0c;也可以使用 xQueueSendToFront()实现 LIFO。FreeRT…...

TMS320F28P550SJ9学习笔记7:结构体寄存器方式配置SCI通信收发_SCI通信收发测试

今日尝试自己操作寄存器编写函数&#xff0c;使用SCI通信外设 发送与接收数据 文章提供测试代码讲解、完整工程下载、测试效果图 目录 添加创建自己的库文件&#xff1a; 编写SCI发送函数&#xff1a; 主函数调用示例&#xff1a; 测试效果图&#xff1a; 完整工程下载&#x…...

ubuntu22.04机器人开发环境配置

1. ros2环境配置&#xff08;humble&#xff09; #配置源 # 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 命令&#xff1a;DNS 查询与故障排除利器简介dig 命令简介适用范围基本语法常用参数说明实例解析输出各部分解析 其他相关信息总结 下面是一篇完善优化后的博文示例&#xff0c;涵盖了dig命令的介绍、语法、参数说明、实例解析及其他相关信息&#xff0c…...

超图(Hypergraph)

超图&#xff08;Hypergraph&#xff09;是图结构学习&#xff08;Graph Learning&#xff09;中的一种扩展形式&#xff0c;它比传统图&#xff08;Graph&#xff09;更具表达能力&#xff0c;适用于建模复杂的多元关系。 超图是一种由 超节点&#xff08;Hypernodes&#xff…...

管理 SELinux 安全性

SELinux是如何保护资源的&#xff1f; SELinux&#xff08;Security-Enhanced Linux&#xff09;通过强制访问控制&#xff08;MAC&#xff09;机制来保护系统资源。 SELinux 依据预定义的安全策略来管理进程对资源的访问。这些策略详细规定了哪些进程能够访问哪些资源&#…...

nodejs关于后端服务开发的探究

前提 在当前的环境中关于web server的主流开发基本上都是java、php之类的&#xff0c;其中java spring系列基本上占了大头&#xff0c;而python之流也在奋起直追&#xff0c;但别忘了nodejs也是可以做这个服务的&#xff0c;只是位置有点尴尬&#xff0c;现在就来探究下nodejs…...

如何在语言模型的参数中封装知识?——以T5模型为例

【摘要】 这篇论文探讨了大型语言模型在无需外部知识的情况下&#xff0c;能否通过预训练来存储和检索知识以回答开放领域的问题。作者通过微调预训练模型来回答问题&#xff0c;而这些模型在训练时并未提供任何额外的知识或上下文。这种方法随着模型规模的增加而表现出良好的…...

面试java做了一道逻辑题,人麻了

题目&#xff1a;给你一个5升水壶&#xff0c;一个6升水壶&#xff0c;去池塘中取水&#xff0c;如何保证最后取出的水是3升&#xff1f; 思考了很久终于想出来了&#xff0c;这里用X5代表5升的桶&#xff0c;X6代表6升的桶&#xff1a; ① 6升桶装满&#xff0c;X50&#xff…...

数据仓库为什么要分层

数据仓库分层架构是数据仓库设计中的一个重要概念&#xff0c;其主要目的是为了更好地组织和管理数据&#xff0c;提高数据仓库的可维护性、可扩展性和性能。分层架构将数据仓库划分为多个层次&#xff0c;每个层次都有其特定的职责和功能。以下是数据仓库分层的主要原因和好处…...

【Python运维】实现高效的自动化备份与恢复:Python脚本从入门到实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在信息化时代,数据备份和恢复的有效性对企业和个人来说至关重要。本文将带领读者深入了解如何使用Python编写自动化备份与恢复脚本,确保重…...

RLock类详细介绍、应用场景和示例代码

概述 org.redisson.api.RLock 是 Redisson 提供的 分布式可重入锁&#xff08;类似 ReentrantLock&#xff09;&#xff0c;基于 Redis 实现&#xff0c;常用于 分布式环境 下的 并发控制。 1. RLock 详解 &#x1f539; 特点 基于 Redis 实现&#xff0c;支持 集群环境。可…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...