SSM 中的拦截器(Interceptor):作用与实现原理

news2024/11/28 0:36:17

SSM 中的拦截器(Interceptor):作用与实现原理

拦截器(Interceptor)是 Spring 框架中的一个重要组件,也在 Spring + Spring MVC + MyBatis(SSM)等框架中起到了关键作用。本文将深入探讨拦截器在 SSM 中的角色和功能,以及如何实现一个自定义的拦截器。

在这里插入图片描述

什么是拦截器?

拦截器是一种应用程序设计模式,它用于截取、拦截或捕获某些事件或行为,然后在不干预原始请求的情况下执行预定义的操作。在 SSM 中,拦截器主要用于处理 HTTP 请求和响应的过程,在请求到达控制器之前和响应返回客户端之前执行特定的操作。

拦截器是 Spring 框架的一部分,它允许开发者在处理请求的不同阶段插入自己的逻辑,如权限验证、日志记录、性能监控等。拦截器通常在 Spring MVC 中使用得最广泛,但也可以在 Spring + MyBatis 或其他框架中使用。

拦截器的作用

拦截器在 SSM 中具有多种重要作用:

1. 权限验证

拦截器可以用于验证用户是否有权限访问某个特定的页面或执行某个操作。例如,一个在线商店的拦截器可以检查用户是否登录以及是否具有购买商品的权限。

public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 检查用户是否登录,如果未登录,跳转到登录页面
        if (!isUserLoggedIn(request)) {
            response.sendRedirect("/login");
            return false;
        }
        // 检查用户是否有权限访问该页面或执行该操作
        if (!hasPermission(request)) {
            response.sendRedirect("/unauthorized");
            return false;
        }
        return true;
    }

    // 省略实现细节
}

2. 日志记录

拦截器可以用于记录请求和响应的详细信息,以便进行调试、性能分析或安全审计。通过拦截器,我们可以捕获请求的参数、执行时间、响应状态码等信息。

public class LoggingInterceptor implements HandlerInterceptor {

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // 记录请求信息,包括请求路径、请求参数、执行时间等
        logRequestInfo(request);
        // 记录响应信息,包括响应状态码、响应内容等
        logResponseInfo(response);
    }

    // 省略实现细节
}

3. 性能监控

拦截器可以用于监控应用程序的性能,包括请求处理时间、资源消耗等。这有助于发现性能瓶颈并进行优化。

public class PerformanceInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        request.setAttribute("startTime", System.currentTimeMillis());
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        long startTime = (long) request.getAttribute("startTime");
        long endTime = System.currentTimeMillis();
        long executionTime = endTime - startTime;
        // 记录请求处理时间
        logPerformance(request, executionTime);
    }

    // 省略实现细节
}

实现一个自定义拦截器

要实现一个自定义的拦截器,在 SSM 中,一般需要完成以下步骤:

  1. 创建一个类,实现 HandlerInterceptor 接口。
  2. 在拦截器中实现相应的逻辑,例如权限验证、日志记录或性能监控。
  3. 配置拦截器,告诉 Spring 在哪些请求路径下应用该拦截器。

以下是一个示例,展示如何创建一个简单的拦截器,用于记录请求的处理时间:

public class PerformanceInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        request.setAttribute("startTime", System.currentTimeMillis());
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        long startTime = (long) request.getAttribute("startTime");
        long endTime = System.currentTimeMillis();
        long executionTime = endTime - startTime;
        // 记录请求处理时间
        logPerformance(request, executionTime);
    }

    private void logPerformance(HttpServletRequest request, long executionTime) {
        String requestURI = request.getRequestURI();
        String method = request.getMethod();
        System.out.println("Request URI: " + requestURI);
        System.out.println("HTTP Method: " + method);
        System.out.println("Execution Time: " + executionTime + "ms");
    }
}

配置拦截器在 Spring MVC 中的应用:

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <bean class="com.example.PerformanceInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

以上配置会将 PerformanceInterceptor 应用到所有请求路径上。

总结

拦截器是 SSM 框架中的重要组件,用于处理请求和响应的过程中执行各种逻辑操作。它的作用包括权限验证、日志记录、性能监控等。通过实现自定义拦截器,开发者可以根据项目的需求扩展其功能,以提高应用程序的可维护性、安全性和性能。通过了解拦截器的原理和用法,可以更好地应用它来满足项目的

需求。

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

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

相关文章

阿里云关系型数据库RDS详细说明

阿里云RDS关系型数据库大全&#xff0c;关系型数据库包括MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;阿里云百科分享阿里云RDS关系型数据库大全&#xff1a; 目录 阿里云RDS关系型数据库大全 …

基于Java的在线课程教程计划管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

已解决: Go Error: no Go files in /path/to/directory问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

我的第一个react.js 的router工程

react.js 开发的时候&#xff0c;都是针对一个页面的&#xff0c;多个页面就要用Router了&#xff0c;本文介绍我在vscode 下的第一个router 工程。 我在学习react.js 前端开发&#xff0c;学到router 路由的时候有点犯难了。经过1-2天的努力&#xff0c;终于完成了第一个工程…

【JUC并发编程--java线程】

文章目录 1. 线程1.1 线程的使用线程运行原理 1. 线程 1.1 线程的使用 方法一&#xff0c;直接使用 Thread&#xff1a; 方法二&#xff0c;使用 Runnable 配合 Thread&#xff1a; 把【线程】和【任务】&#xff08;要执行的代码&#xff09;分开 Thread 代表线程Runnabl…

mac系统占用内存太大怎么办?

Mac的内存大小有限&#xff0c;一旦运行软件太多&#xff0c;会导致Mac无法打开软件或者电脑卡顿&#xff0c;那么Mac系统占用内存过大怎么有效清理呢&#xff1f;本期小编就来帮大家看看当系统占用内存太大的时候应该怎么办 mac系统占用内存过大怎么清理 Mac的内存大小决定了…

网络工程师是安装摄像头的吗

大家好&#xff0c;我是网络工程师成长日记实验室的郑老师&#xff0c;您现在正在查看的是网络工程师成长日记专栏&#xff0c;记录网络工程师日常生活的点点滴滴 有个同学说他现在本科毕业去了一家公司&#xff0c;规模不大。他说只有14个人上社保的。这家公司主要是安装网络摄…

需求放缓、价格战升级、利润率持续恶化对小鹏汽车造成了严重影响

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 收入和每股收益不及预期&#xff0c;亏损创记录 财报显示&#xff0c;小鹏汽车&#xff08;XPEV&#xff09;2023年第二季度收入为50.6亿元人民币(合7亿美元)&#xff0c;略低于预期&#xff0c;而且还产生了比预期更大的亏…

EasyEdge 智能边缘控制台通过sdk发布应用

离线部署SDK生成 模型部署完成后会出现下载SDK的按钮&#xff0c;点击按钮下载SDK并保存好SDK。 进入EasyDL官网的技术文档 安装智能边缘控制台 跟着教程&#xff0c;完成安装&#xff1a;点此链接 树莓派4b是Linux arm64的架构&#xff0c;点击对应的链接进行下载。 下载完成…

【深入了解Java String类】

目录 String类 常用方法 字符串的不可变性 String的内存分析 StringBuilder类 解释可变和不可变字符串 常用方法 面试题&#xff1a;String&#xff0c;StringBuilder&#xff0c;StringBuffer之间的区别和联系 String类的OJ练习 String类 【1】直接使用&#xff0c…

【FreeRTOS】FreeRTOS移植stm32详细步骤介绍

我在查找FreeRTOS移植的相关教程特别少&#xff0c;所以想非常详细的介绍FreeRTOS移植stm32详细步骤&#xff0c;包括源码的下载&#xff0c;源码介绍&#xff0c;系统移植&#xff0c;代码验证等&#xff0c;每一步都有对应的介绍和解释&#xff0c;希望可以帮助到你们。 文章…

【VINS】苹果手机采集单目相机+IMU数据离线运行VINS-Mono

0.准备工作 开个新坑&#xff0c;之前用Android手机做过离线采集数据的实验&#xff0c;这次用IPhone来测试&#xff01; 1.虚拟机配置Mac OS 下载一个Mac OS 的ios镜像&#xff0c;打开虚拟机按照跟Ubuntu差不多的方式安装&#xff0c;但是发现没有Mac OS的入口。 因为VMwa…

字符函数、字符串函数和内存函数

朋友们&#xff0c;今天追秋给大家带来的是一些函数的介绍&#xff0c;包括字符函数、字符串函数和内存函数。 字符串函数 字符串函数分为以下几类: 1.长度不受限制的字符串函数:strlen;strcpy;strcat;strcmp; 2.长度受限制的字符串函数:strncpy;strncat;strncmp. 3.还有一些特…

【C++杂货铺】set 和 map 使用总结

文章目录 一、前言1.1 关联式容器1.2 键值对1.3 树型结构的关联式容器 二、set2.1 set的介绍2.2 set的使用2.2.1 set 的模板参数列表2.2.2 set 的构造2.2.3 set 的迭代器2.2.4 set 的容量2.2.5 set 修改操作2.2.6 set 的使用举例 三、multiset3.1 multiset 的介绍3.2 multiset …

C++goto语句

在本文中&#xff0c;您将了解goto语句&#xff0c;它是如何工作的&#xff0c;以及为什么应该避免它。在C 编程中&#xff0c;goto语句用于通过将控制权转移到程序的其他部分来更改程序执行的正常顺序。 goto语句的语法 goto label; ... .. ... ... .. ... ... .. ... label…

【C++】笔试训练(三)

目录 一、选择题二、编程题1、字符串中找出连续最长的数字串2、数组中出现次数超过一半的数字 一、选择题 1、以下程序的输出结果是&#xff08;&#xff09; #include <stdio.h> int main() {char a[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, * p;int i;i 8;p a i;p…

【考研数学】高等数学第七模块 —— 曲线积分与曲面积分 | 3. 对面积的曲面积分(第一类曲面积分)

文章目录 二、曲面积分2.1 对面积的曲面积分&#xff08;第一类曲面积分&#xff09;2.1.1 问题引入 —— 曲面的质量2.1.2 对面积的曲面积分定义及性质2.1.3 对面积的曲面积分的计算法 写在最后 二、曲面积分 2.1 对面积的曲面积分&#xff08;第一类曲面积分&#xff09; 2…

小谈设计模式(12)—迪米特法则

小谈设计模式&#xff08;12&#xff09;—迪米特法则 专栏介绍专栏地址专栏介绍 迪米特法则核心思想这里的“朋友”指当前对象本身以参数形式传入当前对象的对象当前对象的成员变量直接引用的对象目标 Java程序实现程序分析 总结 专栏介绍 专栏地址 link 专栏介绍 主要对目…

【自定义类型】--- 位段、枚举、联合

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言进阶之路&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅数据结构探索&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

Hypermesh联合LS-DYNA的子弹侵彻计算

Hypermesh凭借强大的网格划分和方便的求解设置功能而被广泛用于DYNA求解器的前处理。本文通过bullet穿透铝合金板侵彻计算来简单介绍Hypermesh和LS-DYNA的联合使用。 计算模型如图1所示&#xff0c;为1/4模型&#xff0c;bullet材料为钢材&#xff0c;被穿透的板为铝合金AL202…