登录校验-Interceptor-详解

news2024/12/30 2:55:05

目录

拦截路径

执行流程

只有拦截器

过滤器和拦截器同时存在

拦截路径

  • 拦截器可以通过需求,在配置类中配置不同的拦截路径
    • 可以设置要拦截的路径以及不进行拦截的路径
      • package com.example.tlias.config;
        
        import com.example.tlias.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 // todo 将该类标志为配置类
        public class WebConfig implements WebMvcConfigurer {
            @Autowired
            private LoginCheckInterceptor loginCheckInterceptor;
        
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                // todo 注册拦截器并知道拦截器要拦截的资源
                registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login"); // todo 配置拦截的路径以及不拦截的路径
            }
        }
        
  • 拦截路径含义举例
    /*一级路径能匹配/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

执行流程

只有拦截器

  • 在Spring Boot框架下,拦截器的执行流程如下:

    • 当客户端发送请求到Spring Boot应用时,请求将首先经过DispatcherServlet。

    • DispatcherServlet会根据配置的URL映射规则,将请求分发给相应的Controller处理。

    • 在请求到达Controller之前,拦截器将会被执行。拦截器的执行顺序与其添加的顺序有关,可以通过配置类中的addInterceptors()方法的顺序来控制拦截器的执行顺序。

    • 在拦截器的preHandle()方法中,可以进行一些预处理操作,例如权限验证、参数校验等。如果在preHandle()方法中返回false,则表示拦截器终止请求的继续执行,后续的拦截器和Controller将不会被执行。

    • 如果拦截器的preHandle()方法返回true,则请求将继续向下执行,到达Controller进行业务处理。

    • 在Controller处理完业务逻辑后,请求将返回到拦截器的postHandle()方法。在这里可以对响应结果进行处理,例如添加额外的响应头信息、修改响应内容等。

    • 最后,请求将返回到拦截器的afterCompletion()方法。在这里可以进行一些清理操作,例如释放资源、记录日志等。afterCompletion()方法将在请求完成后执行,无论是否发生异常。

  • 总结起来,拦截器在Spring Boot框架下的执行流程是:DispatcherServlet -> 拦截器的preHandle() -> Controller -> 拦截器的postHandle() -> 拦截器的afterCompletion()。通过在拦截器的不同方法中实现相应的逻辑,可以在请求处理前后进行预处理和后处理操作。

过滤器和拦截器同时存在

  • 在SpringBoot框架中,同时存在过滤器(Filter)和拦截器(Interceptor)时的执行流程如下:

    • 当请求到达服务器时,首先会经过Servlet容器(tomcat等)的DispatcherServlet。
    • DispatcherServlet会根据配置的过滤器链(Filter Chain)来依次执行过滤器。
    • 过滤器链是按照配置的顺序依次执行的,每个过滤器都可以对请求进行处理或修改。
    • 过滤器可以在请求到达Servlet之前或之后进行操作。
    • 过滤器链的最后一个过滤器会将请求传递给下一个处理组件,例如Servlet或Controller。
    • 当请求到达控制器(Controller)之前,首先会经过Servlet容器的DispatcherServlet。
    • DispatcherServlet会根据配置的拦截器链(Interceptor Chain)来依次执行拦截器。
    • 拦截器链是按照配置的顺序依次执行的,每个拦截器都可以在请求到达控制器之前或之后进行处理。
    • 拦截器可以在请求到达控制器之前或之后进行操作。
    • 拦截器链的最后一个拦截器会将请求传递给控制器(Controller)进行处理。
    • 在控制器处理完请求后,请求会再次经过拦截器链中的拦截器,按照相反的顺序执行。
  • 示例代码:
    • 拦截器(Interceptor)
      • package com.example.tlias.Interceptor;
        
        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 // 将该类标记为组件交给IOC容器管理
        public class LoginCheckInterceptor implements HandlerInterceptor {
            @Override  // todo 在目标资源方法(控制类中的方法)执行之前执行,返回true:放行;返回false:不放行
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                System.out.println("preHandle()方法运行了");
                return true;
            }
        
            @Override // todo 在目标资源方法执行之后执行
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
                System.out.println("postHandle()方法运行了");
            }
        
            @Override // todo 在视图渲染完毕后执行,最后执行
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
                System.out.println("afterCompletion()发运行了");
            }
        }
        
    • 过滤器(Filter)

      • package com.example.tlias.Filter;
        
        
        import jakarta.servlet.*;
        import jakarta.servlet.annotation.WebFilter;
        
        import java.io.IOException;
        
        @WebFilter("/*") // todo 设置当前过滤器要拦截的请求
        public class JWTFilter implements Filter {
            @Override// todo  初始化方法,Web服务器启动时,创建Filter时调用,只调用一次
            public void init(FilterConfig filterConfig) throws ServletException {
                Filter.super.init(filterConfig);
                System.out.println("init初始化方法执行了");
            }
        
            @Override  // todo 拦截到请求时就会调用该方法,可调用多次
            public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                System.out.println("JWTFilter放行之前的逻辑");
                // todo 放行请求,让其访问对应的资源
                filterChain.doFilter(servletRequest, servletResponse);
                System.out.println("JWTFilter放行之后的逻辑");
        
            }
        
            @Override // todo 销毁方法,服务器关闭时调用,只调用一次
            public void destroy() {
                Filter.super.destroy();
                System.out.println("destroy销毁方法执行了");
            }
        }
        
    • 首先启动项目

      • 运行日志

        •  Filter过滤器中的init()初始化方法首先执行了                        
    • 发送请求
      • 运行日志
        •  
        •  首先运行Filter中放行之前的逻辑,然后运行拦截器(Interceptor)中的preHandle()方法,返回值为true的话,就放行执行Web资源(Controller类),然后执行过滤器(Interceptor)中的potHandle()方法,然后执行Filter过滤器中放行后的逻辑。

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

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

相关文章

如何判断自动化测试的时机?

判断自动化测试的时机时,可以考虑以下因素: 1、软件稳定性评估: 确定软件的开发阶段,如果软件还在快速迭代和开发中,可能变动频繁,不适合引入自动化测试。 分析软件的功能和接口是否已经相对稳定&#xf…

iOS砸壳系列之三:Frida介绍和使用

当涉及从App Store下载应用程序时,它们都是已安装的iOS应用(IPA)存储在设备上。这些应用程序通常带有保护的代码和资源,以限制用户对其进行修改或者逆向工程。 然而,有时候,为了进行调试、制作插件或者学习…

基于 vSphere 环境安装 Oracle19c RAC 详细过程

文章目录 前言1. 安装环境说明2. 配置规划说明2.1. 网络规划2.2. 目录规划2.3. 磁盘规划 3. 设置系统环境3.1. 删除 virbr0 设备3.2. 配置主机网络3.3. 配置 hosts 解析3.4. 关闭系统防火墙3.5. 关闭 SELINUX3.6. 关闭时钟同步服务3.7. 关闭 avahi-daemon 守护进程3.8. 准备软件…

数据分析作业四-基于用户及物品数据进行内容推荐

## 导入支持库 import pandas as pd import matplotlib.pyplot as plt import sklearn.metrics as metrics import numpy as np from sklearn.neighbors import NearestNeighbors from scipy.spatial.distance import correlation from sklearn.metrics.pairwise import pairwi…

【Python|第40期】Python操作MongoDB

日期:2023年8月28日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

一步一步实验,讲解python中模块和包的使用

背景 为什么要提出这个问题? 在一个项目中,每一个python文件打开后,都会看到依赖了其他的一些包、模块等;概念混乱,魔改目标不清晰 为什么要修改? 如果需要将某开源包进行自定义处理,不再使…

AI智慧,书香飘溢|在图书馆的世界,知识与未来交汇!

“如果有天堂,天堂应该是图书馆的模样。”阿根廷国家图书馆前馆长、著名作家博尔赫斯如此形容图书馆。人类文明的演进与传承,倚仗于知识的积累,而知识的载体往往绕不开书籍,其集散地——图书馆,更是在这一过程扮演着极…

【精算研究01/10】 计量经济学的性质和范围

一、说明 计量经济学是使用统计方法来发展理论或测试经济学或金融学中的现有假设。计量经济学依赖于回归模型和零假设检验等技术。计量经济学也可以用来预测未来的经济或金融趋势。 图片来源:https://marketbusinessnews.com 二、 计量经济之简介 计量经济学是对经济…

javacv基础02-调用本机摄像头并预览摄像头图像画面视频

引入架包&#xff1a; <dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.5.5-1</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId…

【校招VIP】算法考点之堆排

考点介绍&#xff1a; 排序算法属于数据结构和算法的基础内容&#xff0c;并且也是大厂笔试中的高频考点。 堆排序是使用一棵树存储序列这个课树只保证跟节点是这棵树中的最小值&#xff0c;但并不保证其他节点是按顺序的。因此他的排序是每次从堆中取得堆顶&#xff0c;取得 n…

Qt Scroll Area控件设置,解决无法显示全部内容,且无法滚动显示问题。

前言&#xff0c;因为要显示很多条目的内容&#xff0c;原来是用Vertical Layout控件里面嵌套Horizontal layout显示了很多行控件&#xff0c;发现最简单的方法就是使用滚动条控件&#xff0c;但是无论如何调整需要滚动的控件高度&#xff0c;始终无法滚动显示内容。也就是说添…

5. 线性层及其他层

5.1 神经网络结构 5.2 线性拉平 import torch import torchvision from torch import nn from torch.nn import ReLU from torch.nn import Sigmoid from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterdataset torchvision.datase…

ant-vue1.78版监听a-modal遮罩层的滚动事件

监听a-modal遮罩层的滚动事件 我们开发过程中经常有遇到监听页面滚动的事件需求&#xff0c;去做一些下拉加载或者是下拉分页的需求&#xff0c;我们直接在vue的生命周期中去绑定事件监听非常的方便&#xff0c;但如果是弹框的遮罩层的滚动监听呢&#xff1f;页面的监听完全是…

Stone Prover:StarkWare的STARK Prover

1. 引言 StarkWare将基于Apache 2.0 license&#xff0c;开源其以C编写的STARK Prover&#xff0c;名为Stone&#xff08;STARK one&#xff09;。 其基本流程为&#xff1a; 1&#xff09;编写Cairo0程序。2&#xff09;使用Cairo工具 将Cairo0程序编译为CASM。3&#xff…

数据结构:八种数据结构大全

数据结构 1.1 数据结构概述 数据结构是计算机存储、组织数据的方式&#xff1b;通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构的优良将直接影响着我们程序的性能&#xff1b;常用的数据结构有&#xff1a;数组&#xff08;Array&#xff…

K8S Nginx Ingress实现金丝雀发布

通过给 Ingress 资源指定 Nginx Ingress 所支持的 annotation 可实现金丝雀发布。 需给服务创建2个 Ingress&#xff0c;其中1个常规 Ingress&#xff0c;另1个为带 nginx.ingress.kubernetes.io/canary: "true" 固定的 annotation 的 Ingress&#xff0c;称为 Cana…

浅谈Lua协程和函数的尾调用

前言 虽然不经常用到协程&#xff0c;但是也不能谈虎色变。同时&#xff0c;在有些场景&#xff0c;协程会起到一种不可比拟的作用。所以&#xff0c;了解它&#xff0c;对于一些功能&#xff0c;也会有独特的思路和想法。 协程 概念 关于进程和线程的概念就不多说。 那么…

这所985专业课均分130!复试笔试很难!淘汰率很高!

一、学校及专业介绍 东南大学坐落于六朝古都南京&#xff0c;是享誉海内外的著名高等学府。学校是国家教育部直属并与江苏省共建的全国重点大学&#xff0c;是国家“双一流”、“985工程”、“211工程”重点建设高校。2017年&#xff0c;东南大学入选世界一流大学建设名单。 …

字符集(Latin1,GBK,utf8,utf8mb4)

Latin1 1个字符占一个字节GBK 1个字符占两个字节utf8utfmb3 1个字节占三个字节utf8mb4 1个字符占四个字节

OLED透明屏高清:什么是OLED透明屏?未来显示技术的巅峰之作

在现代科技快速发展的时代&#xff0c;高清显示已经成为人们对于视觉体验的基本要求。 而OLED透明屏作为一种先进的显示技术&#xff0c;以其出色的高清显示效果和透明度&#xff0c;正逐渐成为未来显示技术的巅峰之作。 一、什么是OLED透明屏 OLED透明屏采用有机发光二极管技…