springMVC-自定义拦截器

一、先来看一个需求

Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,比如对临时文件的清除,或者对某些ip地址进行拦截器.

二、springMVC自定义拦截器介绍

(1)需要实现一个接口 HandlerInterceptor.
(2)有三个方法需要我们重写
        preHandlerO.在目标方法执行之前被调用
        postHandleO:在目标方法执行后在被调用
        afterCompletion0:在所有的任务完毕后,再调用,比如页面渲染完毕后在调用.

三、入门示例 

1、在springMVC的配置文件配置拦截器

<!--    配置拦截器--><mvc:interceptors><ref bean="myInterceptor"/></mvc:interceptors>

2、 自定义一个拦截器,实现接口HandlerInterceptor,并重写这三个方法

//交给springMVC管理
@Component
public class MyInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle....");return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle....");}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion....");}
}

3、写一个测试handler

@Controller
public class InterceptorTestHandler {@RequestMapping(value = "/testInterceptor")public String testInterceptor() {System.out.println("调用了test方法");return "success";}@RequestMapping(value = "/testInterceptor2")public String testInterceptor2() {System.out.println("调用了test2方法");return "success";}
}

4、写一个测试页面

<body>
<h1>test01</h1>
<a href="testInterceptor">测试拦截器01</a><h1>test02</h1>
<a href="testInterceptor2">测试拦截器02</a>
</body>

5、效果

可以看出,拦截器方法的执行顺序 preHandler >目标方法>postHandler>afterCompletion

四、拦截器的细节

1、如果preHandle方法_返回false,则不会再执行目标方法.实际上可以在此响应请求返回给页面

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle....");String mess = "炸弹";if(mess.equals("炸弹")){request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);return false;}else {return true;}}

2.说明:postHandle 在目标方法被执行之后执行.可以在方法中访问到目标方法返回ModelAndView对象 (例如可以改变这个MondelAndView的去向)

在postHandle中,做二次处理

  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {modelAndView.getView();modelAndView.setView();System.out.println("postHandle....");}

3、若preHandle 返回true,则afterCompletion 方法在渲染视图之后被执行
若preHandle 返回false,则afterCompletion方法不会被调用

4、也可以在配置拦截器时,指定该拦截器对某个请求生效,其它请求不生效

<mvc:mapping></mvc:mapping>

<!--    配置拦截器-->
<!--    <mvc:mapping></mvc:mapping> 表示被配置的拦截器只对指定路径的目标方法有效--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/testInterceptor2"/><ref bean="myInterceptor"/></mvc:interceptor></mvc:interceptors>

5、排除掉某些请求<mvc:exclude-mapping path="/test"/>

6、多个拦截器时,如何拦截器中的方法如何执行

简单案例:

1、配置两个拦截器

<!--    配置拦截器-->
<!--    <mvc:mapping></mvc:mapping> 表示被配置的拦截器只对指定路径的目标方法有效--><mvc:interceptors><ref bean="myInterceptor"/>  //即示意图中的A拦截器<ref bean="multiInterceptor"/> //即示意图中的B拦截器</mvc:interceptors>

2、复制刚刚案例的拦截器(新建一个拦截器multiInterceptor),将输出语句加多一个2(入门示例)

3、点击请求,看控制台效果

7、多拦截器时, 还需要注意

(1)如果在第一个拦截器的preXxx方法返回false , 后面的代码统统不执行了
2)如果在第二个拦截器的prexxx方法返回false,则会执行前一个拦截器的aftefxxx方法,再退出.

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

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

相关文章

【Proteus仿真】【Arduino单片机】蓝牙遥控小车

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使LCD1602液晶&#xff0c;L298电机&#xff0c;直流电机&#xff0c;HC05/06蓝牙模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602…

内网渗透基础

内网 内网指的是内部局域网&#xff0c;常说的LAN&#xff08;local area network&#xff09;。常见家庭wifi网络和小型的企业网络&#xff0c;通常内部计算机直接访问路由器设备&#xff0c;路由器设备接入移动电信的光纤实现上网。 内部局域网可以通过交换机/防火墙组成多个…

玩转 Scrapy 框架 (一):Scrapy 框架介绍及使用入门

目录 一、Scrapy 框架介绍二、Scrapy 入门 一、Scrapy 框架介绍 简介&#xff1a; Scrapy 是一个基于 Python 开发的爬虫框架&#xff0c;可以说它是当前 Python 爬虫生态中最流行的爬虫框架&#xff0c;该框架提供了非常多爬虫的相关组件&#xff0c;架构清晰&#xff0c;可扩…

Android开发——添加图片

1、首先选择一张需要的图片&#xff0c;通过左侧的Resource Manage选择“”并选择Import Drawables 选择一张图片 并调整以下两个内容 这两个内容的作用借用谷歌官方的Android开发教程的内容&#xff1a; *Android 设备具有不同的屏幕尺寸&#xff08;手机、平板电脑和电视等…

【Java JMM】编译和优化

1 前端编译 在 Java 技术下, “编译期” 是一个比较含糊的表述, 因为它可能指的是 前端编译器 (“编译器的前端” 更准确一些) 把 *.java 文件转变成 *.class 文件的过程Java 虚拟机的即时编译器 (常称 JIT 编译器, Just In Time Compiler) 运行期把字节码转变成本地机器码的过…

【华为鸿蒙系统学习】- HarmonyOS4.0之App项目开发|自学篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 创建鸿蒙第一个App项目 项目创建 工程目录区 预览区 运行Hello World 基本工程目录 ws:工…

ROS-小海龟案例---ROS命令

ROS-小海龟案例—ROS命令 rosnoderos&#xff1a;节点管理命令&#xff0c;通过此命令可以查看、操作以及监测已经运行的ros节点&#xff1a; rosnode 命令 作用 rosnode list 列出当前运行的node信息 rosnode i…

java编译运行测试

目录结构 F:\test\zy\dto\Demo1.java 测试源代码 package zy1.dto2; public class Demo1{public static void main(String[] args){System.out.println("Demo1 run!!!!");} } 在F:\test运行 javac .\zy\dto\*.java 会默认在F:\test\zy\dto\目录下生成Demo1.cl…

Jmeter参数化 —— 循环断言多方法

1、参数化接口测试数据 注意&#xff1a;csv文档参数化&#xff0c;里面有多少条数据&#xff0c;就要在线程组里循环多少次&#xff0c;不然就只执行一次 2、添加配置元件-计数器 关于计数器&#xff1a; ①Starting Value&#xff1a;给定计数器的初始值; ②递增&#xff1a…

Java开发框架和中间件面试题(1)

1.什么是Spring框架&#xff1f; Spring是一种轻量级框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说的Spring框架就是Spring Framework,它是很多模块的集合&#xff0c;使用这些模块可以很方便的协助我们进行开发。这些模块是核心容器、数据访…

安卓手机如何打开ics文件?ics格式文件用什么软件打开?

什么是ics格式文件&#xff1f;Ics格式文件是什么呢&#xff1f;其实ics格式文件是一种用于保存和交换日历信息的标准格式&#xff0c;它通常可以保存事件的名称、时间等信息&#xff0c;有不少日历、待办软件在导出数据的时候&#xff0c;都是以ics文件导出的。 有不少网友目…

Oracle 11g体系结构整理-明日科技编著

一、体系结构相关术语&#xff0c;逻辑存储结构&#xff0c;物理存储结构&#xff0c;服务器结构&#xff0c;常用数据字典 1.1、数据库管理系统中3个重要概念&#xff1a;实例&#xff0c;数据库&#xff0c;数据库服务器 1-实例是一组oracle后台进程以及在服务器中分配的共…

求职方略-倒金字塔型自我介绍

第一步,开头第一句话提纲挈领,点出你的主要“卖点” 自我介绍的第一句话很重要,要有足够的吸引力,有足够的信息量,还要有足够的说服力,能产生先声夺人的效果。 一般的自我介绍喜欢按照时间线索依次介绍自己的经历,例如:“我大学毕业后就进入一家大公司的研发中心,工…

两种time_embedding

时间嵌入 1 傅里叶时间嵌入 class GaussianFourierProjection(nn.Module):"""Gaussian Fourier embeddings for noise levels."""def __init__(self, embedding_size256, scale1.0):super().__init__()self.W nn.Parameter(torch.randn(embeddi…

java.lang.IllegalStateException: Duplicate key

序言 最近监控扫描出我们项目的某些异常信息&#xff0c;报错java.lang.IllegalStateException: Duplicate key xxx&#xff0c;看到异常来自stream流&#xff0c;然后定位看了一下是某位同事的代码使用stream流把List转Map集合出现重复的key异常信息。List集合A对象来源于某个…

C# WPF上位机开发(QT vs WPF)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 最近经常收到朋友们的私信&#xff0c;他们对C# WPF开发很感兴趣&#xff0c;但是呢&#xff0c;正当准备学习的时候&#xff0c;又有人告诉他们应…

网络安全学习-NTFS安全权限、文件共享

NTFS安全权限 权限概述 设置NTFS权限&#xff0c;实现不同用户访问不同对象&#xff08;文件、文件夹&#xff09;的权限分配正确访问权限后&#xff0c;用户才能访问资源设置权限防止资源被篡改、删除 文件系统概述 文件系统就是这个分区的存储格式&#xff0c;不建立文件…

Linux编程环境和软件设施安装

目录 一、Linux编程环境安装 1.yum安装 2. vim安装&#xff08;文本编辑工具&#xff09; 3. lrzsz安装&#xff08;文件上传下载工具&#xff09; &#xff08;1) 搜索lrzsz安装包 &#xff08;2) 在线安装lrzsz &#xff08;3) 测试 二、Linux软件安装 1. 软件安装方…

Ubuntu 常用命令之 history 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 history命令在Ubuntu系统中用于显示用户执行过的命令列表。这个命令在bash shell中非常有用&#xff0c;特别是当你需要记住你之前执行过的命令时。 history命令的参数如下 -c&#xff1a;清除历史记录。-d offset&#xff1a;删…

Linux patch命令

Linux patch命令用于修补文件。 patch指令让用户利用设置修补文件的方式&#xff0c;修改&#xff0c;更新原始文件。倘若一次仅修改一个文件&#xff0c;可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件&#xff0c;这也是Linux系统核心的升级…