【JavaEE进阶】Spring统一功能处理:拦截器的使用

news2024/11/24 20:29:17

目录

1.什么是拦截器?

2.拦截器的使用

2.1定义拦截器

2.2 注册配置拦截器

3.拦截器详解

3.1 拦截路径

3.2 拦截器的执行流程

4. 使用拦截器实现登录校验

4.1 定义拦截器

4.2 注册配置拦截器


1.什么是拦截器?

拦截器是Spring框架提供的核心功能之⼀, 主要用来拦截用户的请求, 在指定⽅法前后, 根据业务需要执行预先设定的代码.

        也就是说, 允许开发人员提前预定义一些逻辑, 在用户的请求响应前后执行. 也可以在用户请求前阻止其执行.
        在拦截器当中,开发人员可以在应用程序中做一些通用性的操作, 比如通过拦截器来拦截前端发来的请求, 判断Session中是否有登录用户的信息. 如果有就可以放行, 如果没有就进行拦截.

比如我们去银行办理业务,在办理业务前后, 就可以加一些拦截操作
办理业务之前, 先取号, 如果带身份证了就取号成功
业务办理结束, 给业务办理人员的服务进行评价.
这些就是"拦截器"做的工作.

2.拦截器的使用

拦截器的使用步骤分为两步:

1.定义拦截器

2.注册配置拦截器

2.1定义拦截器

定义拦截器: 实现 HandlerInterceptor 接口, 并重写其所有方法

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Slf4j
public class LoginInterceptorTest implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("LoginInterceptor ⽬标⽅法执⾏前执⾏..");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("LoginInterceptor ⽬标⽅法执⾏后执⾏");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("LoginInterceptor 视图渲染完毕后执⾏,最后执⾏");
    }
}

preHandle 中返回 true 和返回 false 的区别:

preHandle方法的返回值会影响目标方法的执行流程: 

  • 返回true:表示继续执行目标方法。如果preHandle方法返回true,则目标方法会继执行,整个请求处理流程会继续进行。

  • 返回false:表示中断目标方法的执行。如果preHandle方法返回false,则目标方法不会被执行,整个请求处理流程会被中断,后续的处理器方法和拦截器方法不会被执行。

总结

preHandle() 方法: 目标方法执行前执行. 返回true: 继续执行后续操作; 返回false: 中断后续操作.
postHandle() 方法: 目标方法执行后执行
afterCompletion() 方法: 视图渲染完毕后执行,最后执行(后端开发现在几乎不涉及视图,暂不了解)

2.2 注册配置拦截器

 注册配置拦截器: 实现WebMvcConfigurer接口, 并重写addInterceptors方法

@Configuration
public class WebConfigTest implements WebMvcConfigurer {
    //自定义的拦截器对象
    @Autowired
    private LoginInterceptorTest loginInterceptorTest;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册自定义的拦截器对象
        registry.addInterceptor(loginInterceptorTest)
                .addPathPatterns("/**"); //设置拦截器的请求路径, (/**表示拦截所有请求)
    }
}

 在图书管理系统中引入上述拦截器的代码

在图书管理系统中点击登录按钮: 

此时拦截器代码的日志记录如下:

可以看到 preHandle 方法执行之后就放行了, 开始执行目标方法, 目标方法执行完成之后执行
postHandleafterCompletion 方法.

我们把拦截器中 preHandle 方法的返回值改为 false, 再观察运行结果

 可以看到, 拦截器拦截了请求, 没有进行响应.

3.拦截器详解

拦截器的入门程序完成之后,接下来我们来介绍拦截器的使用细节。拦截器的使用细节我们主要介绍两个部分:

1.拦截器的拦截路径配置
2.拦截器实现原理
 

3.1 拦截路径

拦截路径是指我们定义的这个拦截器, 对哪些请求生效. 

我们在注册配置拦截器的时候,通过 addPathPatterns() 方法指定要拦截哪些请求. 也可以通过excludePathPatterns() 指定不拦截哪些请求.

上述代码中,我们配置的是 / ** ,表示拦截所有的请求.

比如用户登录校验,我们希望可以对除了登录之外所有的路径生效.

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login")     //排除掉不需要拦截的路径
                .excludePathPatterns("/css/**")         //排除掉不需要拦截的路径
                .excludePathPatterns("/js/**")          //排除掉不需要拦截的路径
                .excludePathPatterns("/pic/**")         //排除掉不需要拦截的路径
                .excludePathPatterns("/**/*.html")      //排除掉不需要拦截的路径
        ;
    }
}

在拦截器中除了可以设置 / ** 拦截所有资源外,还有一些常见拦截路径设置:

 以上拦截规则可以拦截此项目中的使用URL, 包括静态文件(图片文件, JS和CSS等文件).

3.2 拦截器的执行流程

正常的调用顺序:

                       

有了拦截器之后,会在调用 Controller 之前进行相应的业务处理,执行的流程如下图                                            

1.添加拦截器后,执行 Controller 的方法之前, 请求会先被拦截器拦截住. 执行 preHandle() 方法,
这个方法需要返回一个布尔类型的值. 如果返回 true, 就表示放行本次操作, 继续访问 Controller 中的方法. 如果返回 false , 则不会放行 (Controller 中的方法也不会执行).

2. Controller 当中的方法执行完毕后,再回过来执行 postHandle() 这个方法以及afterCompletion() 方法,执行完毕之后,最终给浏览器响应数据.

4. 使用拦截器实现登录校验

学习拦截器的基本操作之后,接下来我们需要完成最后一步操作: 通过拦截器来完成图书管理系统中的登录校验功能

4.1 定义拦截器

session 中获取用户信息,如果 session 中不存在, 则返回 false, 并设置 http 状态码为 401, 否则返回 true.

import com.example.com.constant.Constants;
import com.example.com.model.UserInfo;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 请求处理前执行的逻辑
     * true : 表示放行, 不进行拦截
     * false: 表示拦截, 不进行下一步处理
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("LoginInterceptor priHandle.....");
        //获取session 并且判断session中存储的userInfo信息是否为空
        HttpSession session = request.getSession();
        // getSession(true): session存在就返回, 不存在就创建一个新的session返回 默认是true
        // getSession(false): session存在就返回, 不存在就返回空

        UserInfo userInfo = (UserInfo) session.getAttribute(Constants.USER_SESSION_KEY);
        if(userInfo == null || userInfo.getId() <= 0) {
            //用户未登录
            response.setStatus(401);
            return false;
        }
        return true;
    }
}

4.2 注册配置拦截器

import com.example.com.interceptor.LoginInterceptor;
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
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login")     //排除掉不需要拦截的路径
                .excludePathPatterns("/css/**")         //排除掉不需要拦截的路径
                .excludePathPatterns("/js/**")          //排除掉不需要拦截的路径
                .excludePathPatterns("/pic/**")         //排除掉不需要拦截的路径
                .excludePathPatterns("/**/*.html")      //排除掉不需要拦截的路径
        ;
    }
}

也可以改写成:

import com.example.com.interceptor.LoginInterceptor;
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;
import java.util.Arrays;
import java.util.List;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

    private List<String> excludePaths = Arrays.asList(
            "/user/login",
            "/css/**",
            "/js/**",
            "/pic/**",
            "/**/*.html"
    );
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns(excludePaths)     //排除掉不需要拦截的路径
        ;
    }
}

以上代码在项目中的位置:

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

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

相关文章

数据采集之二主一从,485总线共享器

产品概述 485总线共享器示意图 功能示意图 DAQ-GP-485HUB是上海数采物联网推出的一款 RS485总线多路复用共享数据处理器&#xff0c;是一款高性能的通讯设备&#xff0c;专门针对两台主机和 一台从机通讯时导致的数据冲突而设计。在实际工业控制和监控场景中&#xff0c;多个主…

vlan技术--交换机实现局域网分割(Access模式trunk模式)

自作笔记... 目录 vlan技术--交换机连接pc实现局域网分割(Access模式) PC SW1 结果 vlan技术--交换机连接pc实现局域网分割(trunk模式) vlan技术--交换机连接pc实现局域网分割(Access模式) 交换机先创建vlan. 交换机分别进入接口 (配置好连接模式, 连接的vlan) PC SW1 …

华为设备telnet 远程访问配置实验简述

一、实验需求: 1、AR1模拟电脑telnet 访问AR2路由器。 二、实验步骤&#xff1a; 1、AR1和AR2接口配置IP&#xff0c;实现链路通信。 2、AR2配置AAA模式 配置用户及密码 配置用户访问级别 配置用户telnet 访问服务 AR2配置远程服务数量 配置用户远程访问模式为AAA 配置允许登录…

Boom 3D软件安装包下载-Boom 3D官网最新版下载

众多使用者向我们证明了Boom3D软件31段均衡器和预设&#xff1a;均衡器允许您仅通过手指滑动来调制音频&#xff0c;并将其另存为自定义预设&#xff0c;预设已经精心设计为不同类型的歌曲&#xff0c;因此您能够简单地拨入音频以适应您的心情。相信大家都认同Boom 3D 是一款出…

【云原生】Kubernetes网络知识

Kubernetes网络管理 文章目录 Kubernetes网络管理一、案例概述二、案例前置知识点2.1、Kubernetes网络模型2.2、Docker网络基础2.3、Kubernetes网络通信2.3.1、Pod内容器与内容之间的通信2.3.2、Pod与Pod之间的通信 2.4、Flannel网络插件2.5、Calico网络插件2.5.1、Calico网络模…

秋招突击——6/17——复习{整理昨天的面试资料}——新作{删除链表倒数第n个节点}

文章目录 引言复习新作删除链表倒数第N个节点题目描述个人实现参考实现 总结 引言 主管面&#xff0c;面的很凄惨&#xff0c;不过无所谓了&#xff0c;我已经尽力了。上午都在整理的面经&#xff0c;没有复习算法&#xff0c;而且这两天要弄一下论文&#xff0c;二十号就要提…

JetBrains GoLand 2024 mac/win版:高效开发,Go无止境

JetBrains GoLand 2024是一款专为Go语言开发者设计的集成开发环境(IDE)&#xff0c;为开发者带来了更加高效、智能和便捷的编程体验。 GoLand 2024 mac/win版获取 在代码编辑方面&#xff0c;GoLand 2024提供了全行代码补全功能&#xff0c;通过利用先进的深度学习模型&#x…

CDGA|数据治理要点是数据稳定、规范、安全,就像盖楼盘一样

在数字化浪潮汹涌的时代&#xff0c;数据已经成为企业运营和社会发展的核心驱动力。如同高楼大厦需要稳固的地基和规范的施工流程&#xff0c;数据治理同样需要确保数据的稳定性、规范性和安全性&#xff0c;以构建坚实可靠的数据大厦。 数据治理的首要任务是确保数据的稳定性 …

【linux】Linux分析cpu问题

CPU使用率高怎么分析&#xff1a; 首先先看哪些线程占用资源高看每个线程在干啥&#xff08;类似windows系统的任务管理器&#xff09; 步骤&#xff1a; 定位应用进程 pid jps -l # 查看进程找到线程 tid top -Hp {pid}将 tid 转换成十六进制 printf "%x\n" {…

中国信通院专访镜舟科技:开源商业化走了多远?

据《2023 中国开源发展蓝皮书》显示&#xff0c;随着数字化转型的深入&#xff0c;开源生态在去年快速发展&#xff0c;开源商业化的模式也逐渐成型。镜舟科技作为开源商业化的先行者&#xff0c;也在技术创新和商业拓展中稳步增长。 日前&#xff0c;中国信息通信研究院&…

游戏测试工程师面试,常问的问题有哪些?

一般会在面试中了解以下方面&#xff1a; 1.游戏热情&#xff0c;理解程度 玩过哪些游戏&#xff0c;这些游戏玩过多长时间&#xff0c;玩到什么样的水平&#xff0c;在游戏里花过多少钱 你觉得游戏里&#xff0c;xxx的设计如何&#xff0c;评价一下 2.编程、测试相关 学过哪…

这才多久,ChatGPT-4o 又被碾压了?

大模型皇位易主&#xff1f; 昨天&#xff0c;OpenAI 的竞争对手 Anthropic 发布了其最强大的 AI 模型&#xff1a;Claude 3.5 Sonnet。 目前&#xff0c;Claude 3.5 Sonnet 已经在 Claude.ai 和 Claude iOS 应用程序上免费提供。 据 Anthropic 号称&#xff0c;Claude 3.5 Son…

【Git】--Part4--多人协作

在之前的Git博客中&#xff0c;已经把Git本地相关的操作以及远程操作的介绍完了。如下&#xff1a; Git–Part1–基础操作 - 掘金 (juejin.cn)Git–Part2–分支管理 - 掘金 (juejin.cn)Git–Part3–远程操作 & 配置 & 标签管理 - 掘金 (juejin.cn) 这篇文章会介绍两种…

实时数据处理革命:从传统数据栈到新一代流处理解决方案

“数据像鱼一样&#xff0c;越放越臭&#xff0c;不像酒&#xff0c;越陈越香。” 上述观点可能显得有些尖锐&#xff0c;但也有其道理所在。随着企业努力利用数据来实现新的商业模式&#xff0c;现有的数据栈明显无法继续满足需求&#xff0c;因为传统数据栈设计之初并未考虑到…

智慧校园的含义是什么

智慧校园&#xff0c;这一概念深深植根于现代科技土壤之中&#xff0c;是由人工智能、大数据、云计算等前沿技术深度融合所催生的教育领域革新典范。它不仅仅是一个物理空间&#xff0c;而是一个集成了智能感知、个性化服务、教育资源优化、未来教学模式、高效管理、便捷生活服…

解决element-plus没有导出的成员FormInstance

使用element-plus的el-form时&#xff0c;报错“"element-plus"”没有导出的成员“FormInstance”。你是否指的是“FooterInstance”? 解决方法&#xff1a; 引入ElForm类型&#xff0c;在外重新定义FormInstance的类型为ElForm的实例类型 示例&#xff1a; import…

OpenGL Super Bible 7th-Primitives, Pipelines, and Pixels图元、渲染管线与像素

简介 本文的原版为《OpenGL Super Bible 7th》,是同事给我的,翻译是原文+译文的形势。文章不属于机器直译,原因在于语言不存在一一对应的关系,我将尽可能的按照中国人看起来舒服的方式来翻译这些段子,如果段子让你感到身心愉悦,那还劳烦点个关注,追个更。如果我没有及时…

IDEA、PyCharm等基于IntelliJ平台的IDE汉化方式

PyCharm 或者 IDEA 等编辑器是比较常用的&#xff0c;默认是英文界面&#xff0c;有些同学用着不方便&#xff0c;想要汉化版本的&#xff0c;但官方没有这个设置项&#xff0c;不过可以通过插件的方式进行设置。 方式1&#xff1a;插件安装 1、打开设置 File->Settings&a…

vue2 使用 tailwind css vscode 100%成功

环境 vue -V ---- vue/cli 5.0.8 node -v ----- v16.15.0 npm -v ----- 6.14.18 环境不一样可能不会100%成功哦 创建项目 vue create tailwind 选择vue2 修改package.json "dependencies": {"babel/eslint-parser": "^7.24.7"…

应用案例 | 冷藏集装箱基于云的WiFi无线温度监测系统COMET Cloud

一、集装箱的作用和分类 集装箱运输是国际贸易货物多式联运过程中的重要运输方式。由于集装箱运输具有标准化高、密封性好&#xff0c;破损率低、集约化、规模化、班轮化、成本低、质量好等优点&#xff0c;大大提高了货物运输的安全和效率。 集装箱种类很多&#xff0c;按所…