登录校验的相关知识点

登录校验的相关知识点

  • 【1】会话技术
    • 1)会话:
    • 2)会话跟踪:
    • 3)常见的几种会话跟踪:
  • 【2】JWT令牌
    • 1)定义解释
    • 2)测试生成Jwt令牌并解析
    • 3)注意事项
  • 【3】过滤器Filter
    • 1)过滤器工作原理如下:
    • 2)简单使用示例
    • 3)自定义拦截路径
    • 4)疑问
    • 5)过滤器链
  • 【4】拦截器Interceptor
    • 1)定义理解
    • 2)如何使用
      • 1)定义拦截器,实现Handlerlnterceptor接口,并重写其所有方法
      • 2)注册拦截器
    • 3)拦截路径
    • 4)拦截器的执行流程

【1】会话技术

前言:也就是浏览器每一次的访问客户端,就是一次独立的会话,当是使用http协议,这是无状态的,也就是服务器不会保留关于客户端之前请求的任何信息。会话技术保留不同请求之间的数据共享,从状态管理、而可以解决一些问题:身份验证、数据一致性、状态管理

1)会话:

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

2)会话跟踪:

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

3)常见的几种会话跟踪:

  • 客户端会话跟踪技术: Cookie
    • 优点: HTTP协议中支持的技术
    • 缺点:移动端APP无法使用Cookie不安全,用户可以自己禁用CookieCookie不能跨域
  • 服务端跟踪技术:Session
    • 优点:存储在服务端,安全
    • 缺点:服务器集群环境下无法直接使用Session
      Cookie的缺点
  • 令牌技术
    • 优点
      支持PC端、移动端解决集群环境下的认证问题减轻服务器端存储压力
  • http协议
    HTTP(Hypertext Transfer Protocol)协议是一种无状态协议。这意味着每个HTTP请求都是独立的,服务器不会保留关于客户端之前请求的任何信息。在无状态的HTTP协议中,服务器不能自动跟踪和管理客户端的状态。每次客户端发送请求时,服务器都需要完整地处理该请求,而不考虑之前的请求或状态。服务器不会记住客户端的身份、会话状态或其他上下文信息。

【2】JWT令牌

1)定义解释

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

在这里插入图片描述

2)测试生成Jwt令牌并解析

/*** 测试JWT令牌的生成*/@Testpublic void testGenJwt(){Map<String,Object> claims=new HashMap<>();claims.put("id",1);claims.put("name","hua");String jwt=Jwts.builder().signWith(SignatureAlgorithm.HS256,"huahhh")//签名算法,参数一:编码算法类型,参数二:签名内容.setClaims(claims)//自定义内容(载荷).setExpiration(new Date(System.currentTimeMillis()+3600*1000)) // 设置有效期为1小时.compact();//得到字符串的JWT令牌System.out.println(jwt );}/*** 解析Jwt令牌*/@Testpublic void testParseJwt(){Claims claims= Jwts.parser()//设置签名密钥.setSigningKey("huahhh")//传入要解析的Jwt令牌.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiaHVhIiwiaWQiOjEsImV4cCI6MTY5MzI3ODEyNX0.ZP-K8BAThdNMrIsYRE1O-IPdAayXwbb82kayK9ku-Js")//得到解析后的内容.getBody();System.out.println(claims);}

3)注意事项

  • JWT校验时使用的签名秘钥,必须和生成]WT令牌时使用的秘钥是配套的
  • 如果]WT令牌解析校验时报错,则说明JWT令牌被篡改 或 失效了,令牌非法。

【3】过滤器Filter

  • 过滤器(Filter)是一种在Java Web应用程序中用于对HTTP请求进行预处理和后处理的组件。它可以在请求到达目标资源之前对请求进行修改、验证、记录或拦截,并在响应返回给客户端之前对响应进行修改、处理或拦截。
  • 过滤器通常用于实现与请求和响应相关的共同功能,如身份验证、日志记录、字符编码转换、跨域资源共享(CORS)处理等。通过使用过滤器,可以在多个Servlet或JSP页面之间共享公共逻辑和处理流程,提高代码的重用性和可维护性。

1)过滤器工作原理如下:

  • 当HTTP请求到达Web应用程序时,服务器首先将请求发送给过滤器链中的第一个过滤器。
  • 过滤器对请求进行处理、修改或验证,并决定是否将请求传递给下一个过滤器。
  • 如果有更多的过滤器存在,请求将按照定义的顺序依次传递给下一个过滤器。
  • 最后一个过滤器将请求传递给目标资源(如Servlet或JSP页面)进行处理。
  • 处理完目标资源后,请求经过相同的过滤器链返回,但此时是按照相反的顺序通过过滤器,对响应进行修改或处理。
  • 最终响应被发送给客户端。

2)简单使用示例

  • 定义实现类实现filter接口
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;import java.io.IOException;/*** 配置filter拦截器,需要加上@WebFilter(urlPatterns = "/*")。* 【1】/*表示拦截所有的请求* 【2】Filter是Java Servlet规范的一部分,并不是Spring Boot框架的核心内容。,需要在主类上加上注解:@ServletComponentScan*/
@WebFilter(urlPatterns = "/*")
public class DemopFilter implements Filter {// 初始化方法,在过滤器被创建时调用,通常用于进行一些初始化操作,只调用一次@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);System.out.println("init初始化方法执行了");}// 过滤方法,在每次请求到达时调用,可以对请求和响应进行处理,可以调用多次@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 在这里编写过滤的逻辑和处理代码// 在调用filterChain.doFilter()方法之前可以对请求进行修改或拦截// 调用filterChain.doFilter()方法将请求传递给下一个过滤器或目标资源(如Servlet或JSP页面)/*** 放行*/filterChain.doFilter(servletRequest, servletResponse);// 在调用filterChain.doFilter()方法之后可以对响应进行修改或处理System.out.println("拦截到了请求");}// 销毁方法,在过滤器被销毁时调用,通常用于进行一些清理操作,只调用一次@Overridepublic void destroy() {Filter.super.destroy();System.out.println("destroy方法执行了");}
}
  • 需要在主类上加上注解:@ServletComponentScan//开启了对Servlet组件的支持

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@ServletComponentScan//开启了对Servlet组件的支持
@SpringBootApplication
public class Web_Application {public static void main(String[] args) {SpringApplication.run(Web_Application .class, args);}}

3)自定义拦截路径

在这里插入图片描述

4)疑问

  • 放行后访问对应资源,资源访问完成后,还会回到Filter中吗?
  • 如果回到Filter中,是重新执行还是执行放行后的逻辑呢?执行放行后逻辑

5)过滤器链

过滤器链(Filter Chain)是由多个过滤器组成的链式结构,用于按照特定的顺序依次对HTTP请求进行处理。当一个请求到达时,它将依次经过所有注册在该过滤器链上的过滤器,直到最后一个过滤器,然后再按相反的顺序经过这些过滤器处理响应。

在这里插入图片描述

【4】拦截器Interceptor

1)定义理解

拦截器(Interceptor)是在Web开发中用于对请求进行预处理和后处理的一种机制。在Spring框架中,拦截器是一种用于拦截HTTP请求和响应的组件,可以在请求进入控制器之前和离开控制器之后执行特定的操作。

与过滤器不同,拦截器是Spring框架提供的特性,并且通常与Spring MVC(Model-View-Controller)一起使用,用于对控制器的请求进行拦截和处理。拦截器主要用于实现以下功能:

  1. 预处理:在控制器方法执行之前,可以进行一些预处理操作,例如权限验证、数据准备或日志记录等。

  2. 后处理:在控制器方法执行完成后,可以对响应进行处理,例如添加公共数据、渲染视图或记录响应时间等。

  3. 异常处理:如果控制器方法抛出异常,拦截器可以捕获并处理这些异常,以进行统一的异常处理逻辑。

拦截器与过滤器的区别在于它们的运行位置和作用对象,拦截器针对的是具体的控制器方法,而过滤器则是针对URL路径的。拦截器更具有细粒度的控制能力,可以对特定的控制器方法进行拦截和处理。

2)如何使用

1)定义拦截器,实现Handlerlnterceptor接口,并重写其所有方法

实现该类的时候需要在类上加上注解:@Component,表示把该类的对象交给IOC容器管理,方便注册拦截器的时候可以直接声明该变量。

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Component
public class LoginCheckInterceptor implements HandlerInterceptor {//日标资源方法运行前运行,返回true: 放行,可以执行控制层代码;返回false, 不放行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle......");return true;}//标资源方法运行后运行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle......");}//视图渲染完毕后运行,最后运行@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion......");}
}

2)注册拦截器

import com.example.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @Configuration该注解表示是配置类*/
@Configuration
public class WebConfig implements WebMvcConfigurer {//使用 @Autowired 注解从 IOC(Inversion of Control)容器中获取 LoginCheckInterceptor 的 bean 对象,以便后续注册拦截器。@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;//重写addInterceptors方法注册一个拦截器//使用 registry.addInterceptor 方法将 loginCheckInterceptor 拦截器添加到拦截器链中。//使用 addPathPatterns 方法指定拦截的路径规则。此处的 "/*" 表示拦截所有的请求路径。@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册拦截器,并拦截所有的路径请求资源registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");}
}

3)拦截路径

在这里插入图片描述

4)拦截器的执行流程

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/66824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】简单的小程序:进度条

在学习进度条之前&#xff0c;需要学一点预备知识。 1. 预备知识 回车换行 现在的换行符&#xff08;\n&#xff09;其实就是回车式换行符&#xff0c;另起一行&#xff0c;光标指向最新一行的开头。回车符&#xff08;\r&#xff09;是光标指向这一行的开头。 缓冲区 &a…

VR全景对行业发展有什么帮助?VR全景制作需要注意什么?

引言&#xff1a; 虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;早已不再是科幻电影的概念&#xff0c;而是在以惊人的速度改变着我们的世界。VR全景&#xff0c;作为其中的重要组成部分&#xff0c;正为多个行业带来了全新的机遇。 一、VR全景的应用领…

WebGL Varing变量的作用和内插过程,及执行Varing时涉及的图形装配、光栅化、颜色插值、片元着色器执行机制等详解

目录 前言 在 WebGL 或 OpenGL 中&#xff0c;“varying” 是一种用于在顶点着色器和片元着色器之间传递数据的特殊类型的变量。它允许在顶点着色器对数据进行处理后&#xff0c;在片元着色器中使用该处理后的数据进行进一步计算。 彩色三个点 ​编辑 彩色三个点示例代码…

大数据可视化大屏实战项目(4)物流数据云看台(包括动态登陆页面)—HTML+CSS+JS【源码在文末】(可用于比赛项目或者作业参考中)

大数据可视化大屏实战项目&#xff08;4&#xff09;物流数据云看台&#xff08;包括动态登陆页面&#xff09;—HTMLCSSJS【源码在文末】&#xff08;可用于比赛项目或者作业参考中&#x1f415;&#x1f415;&#x1f415;&#xff09; 一&#xff0c;项目概览 ☞☞☞☞☞☞…

【STM32】学习笔记(TIM定时器)

TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能&#xff0c;而且…

Javase | IO流

目录&#xff1a; 1.输入 (Intput/Read)2.输出 (Output/Write)3.IO4.IO流5.IO流的分类&#xff1a;5.1 分类总述5.2 按照 “流的方向” 进行分类5.3 按照 “读取数据的方式” 进行分类 6.IO包下要重点掌握的流&#xff1a;6.1 文件专属 (流)6.2 转换流 ( 将字节流转换为字符流 …

2023.9 - java - 浅拷贝

与 js的浅拷贝不同&#xff1a; 在 JavaScript 中&#xff0c; Object.assign() 或 spread 运算符等方法可以实现浅拷贝&#xff0c;但只针对对象的第一层属性进行复制。如果一个对象只包含基本数据类型的属性&#xff0c;那么对浅拷贝出来的对象进行修改不会影响原始对象&…

C#安装“Windows 窗体应用(.NET Framework)”

目录 背景: 第一步: 第二步: 第三步&#xff1a; 总结: 背景: 如下图所示:在Visual Studio Installer创建新项目的时候&#xff0c;想要添加windows窗体应用程序&#xff0c;发现里面并没有找到Windows窗体应用(.NET Framework)模板&#xff0c;快捷搜索也没有发现&#…

22.3D等距社交媒体菜单的悬停特效

效果 源码 <!doctype html> <html><head><meta charset="utf-8"><title>CSS Isometric Social Media Menu</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.…

springboot web开发登录拦截器

在SpringBoot中我们可以使用HandlerInterceptorAdapter这个适配器来实现自己的拦截器。这样就可以拦截所有的请求并做相应的处理。 应用场景 日志记录&#xff0c;可以记录请求信息的日志&#xff0c;以便进行信息监控、信息统计等。权限检查&#xff1a;如登陆检测&#xff…

SQL sever中用户管理

目录 一、用户管理常见方法 二、用户管理方法示例 2.1. 创建登录账户&#xff1a; 2.1.1 检查是否创建账户成功&#xff1a; 2.2. 创建数据库用户&#xff1a; 2.2.1检查用户是否创建成功&#xff1a; 2.3. 授予权限&#xff1a; 2.3.1授予 SELECT、INSERT 和 U…

什么是BEM命名规范(Block-Element-Modifier Notation)?它有什么优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ BEM命名规范&#xff08;Block-Element-Modifier Notation&#xff09;⭐ BEM命名结构⭐ 优势⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎…

如何解决分库分表主键问题?

分析&回答 从问题角度出发&#xff1a;我们需要一个全局唯一的 id 来支持&#xff0c;排序问题等。这都是你实际生产环境中必须考虑的问题。可以先看下我们之前的文章分布式系统唯一ID如何生成&#xff1f; 雪花算法和雪花算法的变种是大家常用的 喵呜面试助手&#xff1…

春秋云镜 CVE-2018-1273

春秋云镜 CVE-2018-1273 Spring-data-commons 远程命令执行漏洞 靶标介绍 Spring Data是一个用于简化数据库访问&#xff0c;并支持云服务的开源框架&#xff0c;Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中&…

【算法】滑动窗口

滑动窗口应用场景 关键词&#xff1a; 满足xxx条件&#xff08;计算结果&#xff0c;出现次数&#xff0c;同时包含&#xff09; 最长/最短 子串/子数组/子序列 例如&#xff1a;长度最小的子数组 滑动窗使用思路&#xff08;寻找最长&#xff09; 核心&#xff1a;左右双指…

git大文件推送报错

报错信息 不多掰扯&#xff0c;直接上报错信息和截图 Delta compression using up to 8 threadsRPC failde; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large从以上的报错信息不难看出推送仓库的时候&#xff0c;请求体过大&#xff0c;为…

第五讲Java面向对象——类及类的成员

前言 前面几讲,我们讲解了java的基础知识,也写了很多代码,有没有发现,每次编写代码前都会新建一个类,并且开头是public class修饰。可能有些同学不知道什么是类,以及前面我们提到方法。那么本讲,就要开始深入了解他们。 在开始讲解,我们将先了解一下编程的思想,面向对…

8.Redis-set

Set 常用命令saddsmemberssismemberscardspopsmovesrem集合间操作sinter 交集sinterstoresunion 并集sunionstoresdiff 差集sdiffstore 命令总结 内部编码应用场景使用 set来保存用户的“标签” set(集合)就是把一些有关联的数据放刀一起。 它与list的区别如下&#xff1a; 集合…

zookeeper 集群

zookeeper 集群 1、zookeeper 集群说明 initLimit 是Zookeeper用它来限定集群中的Zookeeper服务器连接到Leader的时限 syncLimit 限制了follower服务器与leader服务器之间请求和应答之间的时限 服务器名称与地址&#xff1a;集群信息&#xff08;服务器编号&#xff0c;服务器…

Blender界面学习03 原点、鼠标所在位置的缩放与旋转

物体的坐标原点可以移动 放大缩小时默认是屏幕中央&#xff0c;修改为鼠标在哪儿就缩放哪儿 默认旋转时围绕屏幕的中心 可以修改为指定对象旋转