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方法,再退出.

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

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

相关文章

大创项目推荐 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

Stable-diffusion-webui本地部署和简要介绍

Stable Diffusion 是一款基于人工智能技术开发的绘画软件&#xff0c;它可以帮助艺术家和设计师快速创建高品质的数字艺术作品。是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像&#xff0c;同时也可以应用于其他任务&#xff0c;如内补绘制、…

MySQL数据库 视图

目录 视图概述 语法 检查选项 视图的更新 视图作用 案例 视图概述 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图只保存…

eventbus,在this.$on监听事件时无法在获取数据

问题&#xff1a;vue中eventbus被多次触发&#xff0c;在this.$on监听事件时&#xff0c;内部的this发生改变导致&#xff0c;无法在vue实例中添加数据。 项目场景 一开始的需求是这样的&#xff0c;为了实现两个组件(A.vue ,B.vue)之间的数据传递。 页面A&#xff0c;点击页面…

ffmpeg 硬件解码零拷贝unity 播放

ffmpeg硬件解码问题 ffmpeg 在硬件解码&#xff0c;一般来说&#xff0c;我们解码使用cuda方式&#xff0c;当然&#xff0c;最好的方式是不要确定一定是cuda&#xff0c;客户的显卡不一定有cuda&#xff0c;windows 下&#xff0c;和linux 下要做一些适配工作&#xff0c;最麻…

Linux创建目录命令@mkdir

目录 命令原型概念作用命令不带参数命令带参数 总结 命令原型 mkdir [ -p ] Linux路径 》参数必填&#xff0c;表示Linux路径&#xff0c;即要创建的文件夹的路径&#xff0c;相对路径或绝对路径均可 》 -p 选项可选择写或不写。-p 表示自动创建不存在的父目录 &#xff08;创…

左值右值引用,完美转发

1.c98/03&#xff0c;类模板和函数模板只能含固定数量的模板参数&#xff0c;c11的新特性可以创建接受可变参数的函数模板和类模板 //Args是一个模板参数包&#xff0c;args是一个函数形参参数包 //声明一个参数包Args… args,这个参数包可以包括0到任意个模板参数 template&l…

成功案例分享:物业管理小程序如何助力打造智慧社区

随着科技的进步和互联网的普及&#xff0c;数字化转型已经渗透到各个行业&#xff0c;包括物业管理。借助小程序这一轻量级应用&#xff0c;物业管理可以实现线上线下服务的无缝对接&#xff0c;提升服务质量&#xff0c;优化用户体验。本文将详细介绍如何通过乔拓云网设计小程…

如何确保游戏翻译的质量

随着全球化的加速和游戏行业的国际化&#xff0c;越来越多的玩家开始接触并喜欢玩国际游戏。然而&#xff0c;由于语言障碍&#xff0c;很多玩家无法理解游戏中的文本和对话&#xff0c;这严重影响了游戏体验。因此&#xff0c;游戏翻译变得尤为重要。那么&#xff0c;如何确保…

【模式识别】探秘判别奥秘:Fisher线性判别算法的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《模式之谜 | 数据奇迹解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1 初识模式识…

助力智能人群检测计数,基于DETR(DEtectionTRansformer)开发构建通用场景下人群检测计数识别系统

在一些人流量比较大的场合&#xff0c;或者是一些特殊时刻、时段、节假日等特殊时期下&#xff0c;密切关注当前系统所承载的人流量是十分必要的&#xff0c;对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段&#xff0c;本文的主要目的是想要…

读算法霸权笔记01_数学杀伤性武器

1. 数学应用助推数据经济&#xff0c;但这些应用的建立是基于不可靠的人类所做的选择 1.1. 房地产危机&#xff0c;大型金融机构倒闭&#xff0c;失业率上升&#xff0c;在幕后运用着神奇公式的数学家们成为这些灾难的帮凶 1.2. 数学逐渐不再关注全球金融市场动态&#xff0c…

Flutter笔记:Web支持原理与实践

Flutter笔记 Web支持原理与实践 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com CSDN&#xff1a;https://blog.csdn.net/qq_28550263/article/details/135037756 华为开发者社区…

任天堂,steam游戏机通过type-c给VR投屏与PD快速充电的方案 三type-c口投屏转接器

游戏手柄这个概念&#xff0c;最早要追溯到二十年前玩FC游戏的时候&#xff0c;那时候超级玛丽成为了许多人童年里难忘的回忆&#xff0c;虽然长大了才知道超级玛丽是翻译错误&#xff0c;应该是任天堂的超级马里奥&#xff0c;不过这并不影响大家对他的喜爱。 当时FC家用机手柄…

【Android】存储读取权限管理理解和api 调研报告

背景 工作和学习需要了解android 权限管理和 对应的api 调用逻辑。 学习 内部路径 不用权限 /data/data/应用包名 相关API Context 类 getCacheDir 缓存路径 getCodeCacheDir 示意路径 getFilesDir 内部文件 文件路径 fileList &#xff08;files 下的所有文件名&…

【Unity基础】9.地形系统Terrain

【Unity基础】9.地形系统Terrain 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;地形编辑器Terrain &#xff08;1&#xff09;创建地形 游戏场景中大多数的山川河流地表地貌都是基…

【单调栈】LeetCode:2818操作使得分最大

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 题目 给你一个长度为 n 的正整数数组 nums 和一个整数 k 。 一开始&#xff0c;你的分数为 1 。你可以进行以下操作至多 k 次&#xff0c;目标是使你的分数最大&#xff1a; 选择一个之前没有选过的 非…

Pipelined-ADC设计二——结构指标及非理想因素(Part1)

本章将详细介绍电路各个模块的设计思路和设计中需要注意的关键点&#xff0c;给出流水线ADC中的非理想因素&#xff0c;并计算出流水线ADC各个模块具体指标。根据电路中信号的传输方向&#xff0c;依次介绍采样保持电路、Sub_ADC&#xff0c;MDAC 等模块的设计。&#xff08;本…

CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem:Webpack5 升级后相关插件和配置更新说明

前言 项目对应的 webpack5 版本如下&#xff1a; npm i webpack5.89.0 -D npm i webpack-cli5.1.4 -D升级插件 说明一下&#xff0c;我更喜欢固定版本号&#xff0c;这样随机bug会少很多&#xff0c;更可控~ npm i postcss-loader6.1.1 -D npm i postcss-pxtorem6.0.0 -D配…

Hive-high Avaliabl

hive—high Avaliable ​ hive的搭建方式有三种&#xff0c;分别是 ​ 1、Local/Embedded Metastore Database (Derby) ​ 2、Remote Metastore Database ​ 3、Remote Metastore Server ​ 一般情况下&#xff0c;我们在学习的时候直接使用hive –service metastore的方式…