SpringMVC拦截器应用实例与优化

news2024/11/24 19:39:20

前言

本文将介绍如何使用SpringMVC的拦截器的基本使用

拦截器概念

SpringMVC拦截器(Interceptor)是一种动态拦截方法调用的机制,它能够在指定的方法调用前后执行预先设定的代码,甚至阻止原始方法的执行。拦截器在Spring MVC框架中主要用于拦截用户请求并做出相应处理,其应用场景包括权限验证、记录请求信息的日志、判断用户是否登录等。

 拦截器核心原理

拦截器的核心原理基于AOP(面向切面编程)思想,通过拦截器链的方式,多个拦截器可以按照一定的顺序对原始被调用功能进行增强。

 拦截器方法

  1. preHandle():在实际handler运行之前执行。此方法返回一个boolean值,用于表示是否中断或继续执行链的处理。当此方法返回true时,handler执行链继续进行;当返回false时,DispatcherServlet认为拦截器本身已经处理了请求(例如,渲染了一个适当的视图),并且不继续执行其他拦截器和执行链中的实际handler。
  2. postHandle():在handler运行后执行,但在视图解析对象之前。此方法可以对ModelAndView做一些修改动作。但需要注意的是,在@ResponseBody和ResponseEntity方法中,postHandle的用处不大,因为这些方法的响应是在HandlerAdapter中和postHandle之前写入和提交的,这意味着对响应进行任何修改都为时已晚。
  3. afterCompletion():在整个请求完成后执行,包括视图渲染。此方法可以用于做资源清理、日志记录等工作。

拦截器配置

在Spring MVC中,可以通过两种方式配置拦截器:

  1. XML配置:在springmvc.xml配置文件中,通过mvc:interceptors标签来配置拦截器。可以配置多个拦截器,并指定每个拦截器的拦截路径和排除路径。
  2. Java配置:通过实现WebMvcConfigurer接口,并重写addInterceptors方法来配置拦截器。这种方式通常用于基于Java的配置方式,如Spring Boot项目。

拦截器案例实现

基于XML配置的拦截器的实现案例

 准备工作

已经实现好了一个web项目的框架,并且配置了springmvc的相关配置 

 第一步:定义一个Controller控制器类

控制器的目的是接收前端请求,并响应结果,这里主要是用来演示拦截器的使用

HelloController 

@RequestMapping("/h")
@Controller  //与Component作用完全一致,只不过有特殊含义
public class HelloController {

    @RequestMapping("/hi")
    public ModelAndView hello(){
        System.out.println("helloController");
        ModelAndView mv=new ModelAndView();
        mv.setViewName("hello");
        mv.addObject("msg","helloooo");
        return mv;
    }

}

第二步:创建一个类继承HandlerInterceptorAdapter类

一个类继承HandlerInterceptorAdapter类,该类就是一个拦截器类

 MyInterceptor

public class MyInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("前置方法");
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("后置方法");
        super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("最终方法");
        super.afterCompletion(request, response, handler, ex);
    }
}

前置方法在控制器方法执行前执行

后置方法在控制器方法执行之后执行

最终方法无论是否异常一定执行

 第三步:在springmvc的配置文件中配置拦截器

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   
            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd      
            http://www.springframework.org/schema/context   
            http://www.springframework.org/schema/context/spring-context-4.1.xsd      
            http://www.springframework.org/schema/mvc   
            http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd      
            http://www.springframework.org/schema/util   
            http://www.springframework.org/schema/util/spring-util-4.1.xsd">

    <context:component-scan base-package="com.csx"/>

    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp"/>

<!--   拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/h/*.do"/>
            <bean class="com.csx.controller.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>   

主要关注拦截器的配置:

  • <mvc:mapping path="/h/*.do"/>
    • 配置拦截路径
  • <bean class="com.csx.controller.MyInterceptor"/>
    • 配置具体拦截器

测试

启动Spring MVC应用,并访问/h/hi.do路径,观察控制台输出,应该能够看到拦截器的三个方法(preHandle、postHandle、afterCompletion)依次被执行的日志信息。  

此时没写对应页面,所以报404错误,主要观察后端控制台信息: 

拦截器生效 

总结

SpingMVC的拦截器主要做两件事

1.创建拦截器

2.配置拦截器 

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

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

相关文章

利士策分享,美国“假旗”行动,是否成为了网络空间的阴霾?

利士策分享&#xff0c;美国“假旗”行动&#xff0c;是否成为了网络空间的阴霾? 在当今这个信息化时代&#xff0c;网络空间已经成为国家间竞争与合作的重要领域。然而&#xff0c;美国却频繁采取一种名为“假旗行动”的卑劣手段&#xff0c;污染全球网络空间&#xff0c;给世…

《最优化方法》

课件是学习的核心内容 这门课&#xff0c;作业自己交&#xff0c;但是老师不做记录&#xff0c;上课不点名&#xff0c; 不记录平时成绩。 第一章 最优化问题的概述 1.1 概述&#xff08;和考试内容无关&#xff0c;了解内容&#xff09; 例题1.1.1运输问题 数学模型&#x…

(37)使用MATLAB画出余弦波的频谱

文章目录 前言一、MATLAB仿真代码二、仿真结果画图 前言 首先使用MATLAB生成一段余弦信号&#xff0c;然后对其进行FFT变换&#xff0c;画出其频谱。 一、MATLAB仿真代码 代码如下&#xff1a; f [50, 100]; % 两个余弦波的频率 fs 1000; …

论文 | OpenICL: An Open-Source Framework for In-context Learning

主要内容&#xff1a; 2. 提供多种 ICL 方法&#xff1a; 3. 完整的教程&#xff1a; 4. 评估和验证&#xff1a; 背景&#xff1a; 随着大型语言模型 (LLM) 的发展&#xff0c;上下文学习 (ICL) 作为一种新的评估范式越来越受到关注。问题&#xff1a; ICL 的实现复杂&#xf…

springboot在线医疗问答平台

基于springbootvue实现的在线医疗问答平台 &#xff08;源码L文ppt&#xff09;4-088 4 系统设计 4.1 功能模块设计 在线医疗问答平台根据权限类型进行分类&#xff0c;主要可分为用户、医生和管理员三大模块。用户、医生模块主要实现了修改个人信息&#xff0c;查看…

力扣题31~40

题31&#xff08;中等&#xff09;&#xff1a; 分析&#xff1a; 其实这题题目比较难懂&#xff0c;题目还是挺简单的 我们可以从后面末尾开始&#xff0c;如果前一个大于后面的&#xff0c;说明后面不用动&#xff0c;如果小于&#xff0c;那就找仅仅大于它的数字放前面&…

一个将.Geojson文件转成shapefile和kml文件的在线页面工具

最近需要读取.geojson格式的流域边界文件。在谷歌地球桌面版和globalMapper中均无法正常读取。下面我发现的一个在线的平台可以很好实现这一功能。 GeoJSON to SHP Converter Online - MyGeodata Cloud ❤️欢迎点赞收藏❤️

2000.1-2024.7中国经济政策不确定性指数(月度)

2000.1-2024.7中国经济政策不确定性指数&#xff08;月度&#xff09; 1、时间&#xff1a;2000.1-2024.7 2、指标&#xff1a;Date、CNEPU 3、来源&#xff1a;China Economic Policy Uncertainty Index 4、说明&#xff1a;中国经济政策不确定性指数&#xff0c;用于衡量…

MongoDB安装保姆级教程

安装MongoDB 1.下载地址 https://www.mongodb.com/try/download/community 这里选择的5版本的。 2.选择zip下载 (也可以选择msi一步步安装) 3.配置环境变量 将MongoDB的bin目录添加到path下 E:\JavaPackage\mongodb\bin 4.检查是否配置成功 cmd里执行 mongod WINR&…

JavaSE——集合12:Map接口实现类—Properties

目录 一、Properties基本介绍 二、Properties常用方法 一、Properties基本介绍 Properties类继承自HashTable类并且实现了Map接口&#xff0c;也是使用一种键值对的形式&#xff0c;来保存数据。Properties的使用特点和HashTable类似Properties还可以用于从xxx.properties文件…

“我们为什么缺少科学精神”演讲内容拆解

演讲人张双南&#xff0c;视频链接&#xff1a; https://tv.cctv.com/2017/04/23/VIDEdqzdpmxStYXAmYBdgDP7170423.shtml

【数据结构】:破译排序算法--数字世界的秩序密码(二)

文章目录 前言一.比较排序算法1.Bubble Sort冒泡排序1.1.冒泡排序原理1.2.冒泡排序过程1.3.代码实现1.4.复杂度和稳定性 2.Quick Sort快速排序2.1递归快速排序2.1.1.递归快速排序原理2.1.2.递归快速排序过程2.1.3.代码实现 2.2.非递归快速排序2.2.1.非递归快速排序原理2.2.2.非…

多线程的状态及切换流程

多线程的状态及切换流程 线程状态说明&#xff1a; 初始化&#xff08;Init&#xff09;&#xff1a;该线程正在被创建。就绪&#xff08;Ready&#xff09;&#xff1a;该线程在就绪列表中&#xff0c;等待 CPU 调度。运行&#xff08;Running&#xff09;&#xff1a;该线程…

Arduino R3笔记24 之 Arduino如何使用MAX7219控制多个数码管?

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:前面学习了单个数码管的控制,但是在大多场合一个数码管是满足不了使用场景的,因此对于数码管的学习,应该学会用尽可能少的端口去驱动更多的数码管,在此情况下,MAX7219比较适合我们使用。 1.M…

成都睿明智科技有限公司共创抖音电商新篇章

在当今这个数字化浪潮汹涌的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多商家竞相追逐的新蓝海。在这片充满机遇与挑战的领域中&#xff0c;成都睿明智科技有限公司凭借其专业的服务、创新的策略和敏锐的市场洞察力&#xff0c;成为了众多商家信赖的合…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)3.5-3.6

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第三周 目标检测&#xff08;Object detection&#xff09;3.5 Bounding Box 预测&#xff08;Bounding box predictions&#xff09;3.6 交并比&#xff08;Intersection over union&#xf…

leetcode36:有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 注…

详解腐烂的苹果(图+代码+广度优先遍历)

描述 给定一个 nm nm 的网格&#xff0c;其中每个单元格中可能有三种值中的一个 0 , 1 , 2。其中 0 表示这个格子为空、1 表示这个格子有一个完好的苹果&#xff0c;2 表示这个格子有一个腐烂的苹果。腐烂的苹果每分钟会向上下左右四个方向的苹果传播一次病菌&#xff0c;并导…

Elsevier旗下老牌TOP上榜On Hold名单!原因涉及“论文工厂”?

【SciencePub学术】上个月突发“On Hold”近10本期刊&#xff0c;看来科睿唯安又是闷声干大事。大家注意&#xff0c;On Hold期间&#xff0c;提交的论文是不能被检索到的&#xff0c;甚至此类期刊有可能随时被WOS目录剔除&#xff0c;所以请大家注意甄别&#xff0c;谨慎投递&…

快速理解http的get和post

在网络通信中&#xff0c;HTTP 协议扮演着非常重要的角色&#xff0c;而不同的 HTTP 方法决定了客户端与服务器之间的交互方式。 这里讲一下最常用的两种方法——GET 和 POST。 一、GET 方法 GET 方法用于从服务器获取资源。 这就像去图书馆借书——你向图书馆请求一本特定的…