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

目录

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.mfbz.cn/a/729005.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据分析必备:一步步教你如何用matplotlib做数据可视化(8)

1、Matplotlib 条形图 条形图或条状图是一种图表或图形&#xff0c;它显示带有矩形条的分类数据&#xff0c;其高度或长度与它们所代表的值成比例。可以垂直或水平绘制条形。 条形图显示了离散类别之间的比较。图表的一个轴显示要比较的特定类别&#xff0c;另一个轴表示测量值…

【python】PyQt5初体验,窗口等组件开发技巧,面向对象方式开发流程实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

国外开源字典集(wordlists)

Assetnote Wordlists Wordlists that are up to date and effective against the most popular technologies on the internet.https://wordlists.assetnote.io/

windows系统停止更新办法

windows系统停止更新 双击启动下载的文件 然后再回到系统-更新这里&#xff0c;选择日期就行。

RK3568技术笔记十四 Ubuntu创建共享文件夹

单击“虚拟机”&#xff0c;单击“设置”&#xff0c;如图所示&#xff1a; 单击“选项”&#xff0c;选择“总是启用&#xff08;E&#xff09;”&#xff0c;单击“添加”&#xff0c;如图所示&#xff1a; 单击“下一步”&#xff0c;如图所示&#xff1a; 单击“浏览”添加…

4LPFA清洗桶带隔板ICP-MS分析清洗系统高洁净特氟龙清洗设备

小瓶清洗系统PFA清洗桶品牌&#xff1a;南京瑞尼克 材质&#xff1a;PFA 耐受温度范围&#xff1a;-200C~260C 小瓶清洗系统是清洗实验室器皿有效的方法。该清洗系统由高纯PFA材质制成&#xff0c;专为热浸泡清洗设计&#xff0c;与传统玻璃烧杯相比&#xff0c;更结实。该小…

【笔记】打卡01 | 初学入门

初学入门:01-02 01 基本介绍02 快速入门库处理数据集网络构建模型训练保存模型加载模型打卡-时间 01 基本介绍 MindSpore Data&#xff08;数据处理层&#xff09; ModelZoo&#xff08;模型库&#xff09; MindSpore Science&#xff08;科学计算&#xff09;&#xff0c;包含…

Chromium 调试指南2024 Mac篇 - 调试 Chromium(三)

1.引言 在完成了环境准备和成功编译Chromium之后&#xff0c;下一步就是进行调试工作。调试是软件开发过程中必不可少的环节&#xff0c;通过调试可以定位和修复代码中的问题&#xff0c;验证新功能的正确性&#xff0c;并确保整个项目的稳定性和高效性。 由于Chromium项目的…

【html】如何利用hbuilderX 开发一个自己的app并安装在手机上运行

引言&#xff1a; 相信大家都非常想开发一款自己的apk&#xff0c;手机应用程序&#xff0c;今天就教大家&#xff0c;如何用hbuilderX 开发一个自己的app并安装在手机上运行。 步骤讲解&#xff1a; 打开hbuilderX &#xff0c;选择新建项目 2.选择5app,想一个名字&#x…

每天写java到期末考试(6.21)--集合4--练习--6.20

练习1&#xff1a; 正常写集合 bool类 代码&#xff1a; import QM_Fx.Student;import java.util.ArrayList;public class test {public static void main(String[] args) {ArrayList<Student> listnew ArrayList<>();//2.创建学生对象Student s1new Student(&quo…

从媒体网站的频道划分看媒体邀约的分类?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 在我们举行活动的时候&#xff0c;通常会邀请媒体到现场来…

基于Python爬虫的城市天气数据可视化分析

基于Python爬虫的城市天气数据可视化分析 一、项目简介二、项目背景三、Python语言简介四、网络爬虫简介五、数据可视化简介六、天气数据爬取与存储6.1 获取目标网页6.2 发送请求6.3 提取数据6.4 保存数据七、天气数据可视化7.1 天气现象轮播图7.2 历史温度分布图7.3 历史风向分…

2134名女性,0感染!艾滋病预防药传出大消息,只需半年注射一次,药厂股价应声暴涨

内容提要 美国生物制药公司吉利德科学公布了Lenacapavir预防艾滋病毒的实验结果&#xff0c;显示出100%有效性。或将为艾滋病预防带来新选择。 文章正文 当地时间周四&#xff08;6月20日&#xff09;&#xff0c;美国生物制药公司吉利德科学在其官网公布一则重磅实验结果&am…

使用mysql的binlog进行数据恢复

1.mysql安装环境 在你本地电脑windows上建一个和生产环境一样的mysql版本 我的是 mysql5.7.43 安装教程可以自行上网搜&#xff08;这里不做介绍&#xff09; 可参考&#xff1a; 1.1安装路径 我的mysql安装路径&#xff1a; D:\mysql\mysql-5.7.43-winx64\bin * 1.2my.in…

官方解决 maven 上传jar包到中央仓库401

目录 目录背景&#xff1a;报错现象一句话解决一句话原因问题描述前车之鉴&#xff1a;尝试无果的记录尝试1&#xff1a;询问 GPT 未果尝试2&#xff1a;搜索引擎未果 正确原因分析&#xff1a;佐证 解决方案&#xff08;三步完成&#xff09;&#xff1a;1. 打开 sonatype2. 生…

MacOS设备远程登录配置结合内网穿透实现异地ssh远程连接

文章目录 前言1. MacOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接MacOS3.1 MacOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接MacOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …

【C++】类和对象(四)拷贝构造、赋值运算符重载

文章目录 四、拷贝构造函数干嘛的&#xff1f;写拷贝构造函数的注意事项正确写法 不显示定义拷贝构造函数的情况浅拷贝:one:示例&#xff1a;内置类型:two:示例&#xff1a;自定义类型一个提问 深拷贝 五、赋值运算符重载运算符重载函数原型注意调用时的两种书写方式完整实现代…

Ant design Vue 表格中显示不同的状态(多条件显示)

比如&#xff1a;后端一个字段有多种状态&#xff1a; 那么后端接口会返回&#xff1a;0 或者 1 或者 2 其中一个&#xff0c;前端需要展示的是对应的文字&#xff0c;像简单的只有两个状态的可以直接在列里面操作&#xff1a; {title: 状态,dataIndex: usable,customRender: …

国产测温速度快且功耗低的温度传感芯片MY18E20可Pin-Pin替换DS18B20

MY18E20是一款国产高精度可编程的数字模拟混合信号温度传感芯片&#xff1b;感温原理基于CMOS半导体PN节温度与带隙电压的特性关系&#xff0c;经过小信号放大、模数转换、数字校准补偿后&#xff0c;数字总线输出&#xff0c;具有精度高、一致性好、测温快、功耗低、可编程配置…

剖析影响大米码垛机性能的关键因素

在现代化粮食加工产业链中&#xff0c;大米码垛机以其高效、精准的自动化操作&#xff0c;成为提升生产效率、降低劳动强度的得力助手。然而&#xff0c;要想充分发挥大米码垛机的性能优势&#xff0c;我们必须深入了解影响其性能的关键因素。星派将深入剖析这些关键因素&#…