登录校验的相关知识点

news2024/11/28 4:31:54

登录校验的相关知识点

  • 【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令牌的生成
     */
    @Test
    public 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令牌
     */
    @Test
    public 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 {

    // 初始化方法,在过滤器被创建时调用,通常用于进行一些初始化操作,只调用一次
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        System.out.println("init初始化方法执行了");
    }

    // 过滤方法,在每次请求到达时调用,可以对请求和响应进行处理,可以调用多次
    @Override
    public 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("拦截到了请求");
    }

    // 销毁方法,在过滤器被销毁时调用,通常用于进行一些清理操作,只调用一次
    @Override
    public 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, 不放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle......");
        return true;
    }

    //标资源方法运行后运行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle......");
    }

    //视图渲染完毕后运行,最后运行
    @Override
    public 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 对象,以便后续注册拦截器。
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
    //重写addInterceptors方法注册一个拦截器
    //使用 registry.addInterceptor 方法将 loginCheckInterceptor 拦截器添加到拦截器链中。
    //使用 addPathPatterns 方法指定拦截的路径规则。此处的 "/*" 表示拦截所有的请求路径。
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册拦截器,并拦截所有的路径请求资源
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
    }
}

3)拦截路径

在这里插入图片描述

4)拦截器的执行流程

在这里插入图片描述

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

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

相关文章

06-限流策略有哪些,滑动窗口算法和令牌桶区别,使用场景?【Java面试题总结】

限流策略有哪些&#xff0c;滑动窗口算法和令牌桶区别&#xff0c;使用场景&#xff1f; 常见的限流算法有固定窗口、滑动窗口、漏桶、令牌桶等。 6.1 固定窗口 概念&#xff1a;固定窗口&#xff08;又称计算器限流&#xff09;&#xff0c;对一段固定时间窗口内的请求进行…

1780_添加鼠标右键空白打开命令窗功能

全部学习汇总&#xff1a; GitHub - GreyZhang/windows_skills: some skills when using windows system. 经常执行各种脚本&#xff0c;常常需要切换到命令窗口中输入相关的命令。从开始位置打开cmd然后切换目录是个很糟糕的选择&#xff0c;费时费力。其实Windows 7以及Windo…

鸿蒙学习笔记之资源管理器(十一)

本次要点&#xff1a; 1.什么是资源管理器 2.资源管理器的应用 1.什么是资源管理器 资源管理器是系统提供的资源管理工具&#xff0c;我们可以用它查看本台电脑的所有资源&#xff0c;特别是它提供的树形的文件系统结构&#xff0c;使我们能更清楚、更直观地认识电脑的文件和…

学会Mybatis框架:让你的开发事半功倍【五.Mybatis关系映射】

目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 导语 一、一对一的关系映射 1.表结构 2.resultMap配置 3.测试关系映射 二、一对多的关系映射 1.表结构 2.resultMap配置 3.测试关系映射 三、多对多的关系映射 1.表结构…

一文讲通嵌入式现状

近年来&#xff0c;随着计算机技术和集成电路技术的迅速发展&#xff0c;嵌入式技术在通讯、网络、工控、医疗、电子等领域日益普及&#xff0c;并发挥着越来越重要的作用。嵌入式系统已成为当前最为热门和前景广阔的IT应用领域之一。 随着信息化、智能化、网络化的不断推进&am…

基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

ARM DIY(七)麦克风调试

前言 上篇文章介绍了扬声器调试&#xff0c;今天介绍下麦克风调试。 硬件 焊接&#xff1a;咪头、电阻、电容 驱动 && 应用程序 音频调试时已完成&#xff0c;参考上篇文章 测试 使能 mic1 # ./amixer -c 0 cset numid12 2 numid12,ifaceMIXER,nameMic1 Captu…

【杂言】写在研究生开学季

这两天搬进了深研院的宿舍&#xff0c;比中南的本科宿舍好很多&#xff0c;所以个人还算满意。受台风 “苏拉” 的影响&#xff0c;原本的迎新计划全部打乱&#xff0c;导致我现在都还没报道。刚开学的半个月将被各类讲座、体检以及入学教育等活动占满&#xff0c;之后又是比较…

【数据结构篇】线性表1 --- 顺序表、链表 (万字详解!!)

前言&#xff1a;这篇博客我们重点讲 线性表中的顺序表、链表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列... 线性表在逻辑上是…

【learnopengl】Assimp构建与编译

文章目录 【learnopengl】Assimp构建与编译1 前言2 Assimp构建与编译2.1 下载源码2.2 CMake构建2.3 VS2022编译 3 在VS中配置Assimp库4 验证 【learnopengl】Assimp构建与编译 1 前言 最近在跟着LearnOpenGL这个网站学习OpenGL&#xff0c;这篇文章详细记录一下教程中关于Ass…

vue的第3篇 第一个vue程序

一 vue的mvvm实践者 1.1 介绍 Model&#xff1a;模型层&#xff0c; 在这里表示JavaScript对象 View&#xff1a;视图层&#xff0c; 在这里表示DOM(HTML操作的元素) ViewModel&#xff1a;连接视图和数据的中间件&#xff0c; Vue.js就是MVVM中的View Model层的实现者 在M…

SpringBoot复习:(60)文件上传的自动配置类MultipartAutoConfiguration

可以看到&#xff0c;定义了一个类型为StandartServletMultipartResolver的bean 用来进行文件上传&#xff0c;定义了一个类型为MultipartConfigElement的bean用来进行上传相关的配置&#xff0c;其中使用了MultipartProperties中的属性&#xff0c;这个类的定义如下&#xff1…

【Day-27满就是快】代码随想录-二叉树-二叉树的最大深度

给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 ———————————————————————————————————— 1. 递归法 可以使用前序和后序遍历。前序就是…

Linux Day12 ---进程间通信

一、管道 1.1 有名管道 有名管道可以在任意两个进程之间通信 1.1.1 有名管道的创建&#xff1a; 命令创建&#xff1a; mkfifo 管道名 系统调用创建 1.1.2 与普通文件区别 打开管道文件&#xff0c;在内存分配一块空间&#xff0c;往管道文件里面写数据&#xff0c;实际是…

产品思维用户思维

用户思维是一种关注用户需求、体验和价值的思维方式,将用户放在产品设计、开发和提供服务的核心位置。它强调了理解用户在不同场景下的需求,提供与之相匹配的解决方案,从而帮助用户实现他们的目标。 描述一个用户时,可以从不同角度来考虑: 按人口属性描述用户: 个人属性…

【python】reshape的使用

import numpy as np x np.array([1,2,3]) print(fx.shape{x.shape}) print(fx.reshape((1,-1)){x.reshape((1,-1))}) print(fx.reshape(3,){x.reshape(3,)}) print(fx.reshape(3,1)\n{x.reshape(3,1)}) print(fx[:,np.newaxis]\n{x[:,np.newaxis]})

IDEA中Run/Debug Configurations添加VM options和Program arguments

1. 现象描述 我在我的IDEA当中打开配置模板后&#xff0c;发现没有VM options和Program arguments&#xff0c;也就是虚拟机选项和程序实参这两项&#xff0c;导致我不能配置系统属性参数和命令行参数&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff0…

Navicat连接数据库报2003错误解决办法

是防火墙还没有开启 查看防火墙管理的端口 设置3306防火墙开启&#xff0c;重载防火墙 连接成功

java实现粤语歌曲0243填词法

粤语歌曲填词法 一、前言 转化成数字歌。对每个音符&#xff0c;提供配合广东话声调的字&#xff0c;选出成为歌词。可以在网上创作&#xff0c;或下载到自己电脑中使用。 简谱 3656536&#xff0c;歌词 落花满天蔽月光。 唱起来配合乐曲音调。这叫做‘叶韵’&#xff0c;又叫…

基于Open3D的点云处理17-Open3d的C++版本

参考&#xff1a; http://www.open3d.org/docs/latest/cpp_api.htmlhttp://www.open3d.org/docs/latest/getting_started.html#chttp://www.open3d.org/docs/release/cpp_project.html#cplusplus-example-projecthttps://github.com/isl-org/open3d-cmake-find-packagehttps:/…