SpringMVC第六天(拦截器)

概念

拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行

作用:

        在指定的方法调用前后执行预先设定的代码

        阻止原始方法的执行

拦截器与过滤器的区别 

归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术

拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行技术增强

示例 

第一步、声明拦截器的Bean,并实现HandlerInterceptor接口

package com.cacb.controller.interceptor;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.handler.Handler;@Component
public class ProjectInterceptor  implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}
}

第二步、定义配置类,继承WebMvcConfigurationSuport,实现addInterceptor方法

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Autowiredprivate ProjectInterceptor projectInterceptor;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(projectInterceptor).addPathPatterns("/books");}
}

第三步、添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Autowiredprivate ProjectInterceptor projectInterceptor;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(projectInterceptor).addPathPatterns("/books");}
}

 第四步(可选)使用标准接口WebMvcConfigurer简化开发(取代support文件)

@Configuration
@ComponentScan("com.cacb.controller")
@EnableWebMvcpublic class SpringMvcConfig  implements WebMvcConfigurer {@AutowiredProjectInterceptor projectInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(projectInterceptor).addPathPatterns("/books");}
}

拦截器执行顺序:

拦截器参数

前置处理

public class ProjectInterceptor  implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");return true;}

参数

        request:请求对象

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}

        response:响应对象

        handler:被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装

        

        返回值

                返回值为false,被拦截的处理器将不执行

后置处理

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

参数

        modelAndView:如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整

完成后处理

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}

参数

        ex:如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理 

拦截器链

拦截器执行顺序

当配置多个拦截器时,形成拦截器链

拦截链的运行顺序参照拦截器添加顺序为准

当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行

当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作

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

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

相关文章

k8s从初识到上天系列第二篇:kubernetes的组件和架构

😉😉 欢迎加入我们的学习交流群呀! ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring、SpringSecurity、Docker、Grpc、各种MQ、Rpc、SpringCloud等等很多应用和源码…

UDF学习(五)FLUENT UDF-DEFINE_INIT宏和DEFINE_DELTAT宏和DEFINE_ADJUST宏

FLUENT UDF-DEFINE_INIT宏 以此为例: DEFINE_INIT(init,domain)//一般格式 #include"udf.h" DEFINE_INIT(init,domain) { cell_t c; Thread *thread; real xc[ND_ND],x,y; thread_loop_c(thread,domain) { begin_c_loop(c,thread) } C_CENTROID(xc,c,t…

【C++】C++ 入门 — 命名空间,输入输出,函数新特性

C 1 前言2 命名空间2.1 概念引入2.2 开始使用2.3 投入应用 3 输入与输出3.1 基础知识3.2 开始使用3.3 注意局限 4 函数新特性4.1 缺省参数4.1.1 开始使用4.1.2 注意事项 4.2 函数重载4.2.1 开始使用4.2.2 如何实现 Thanks♪(・ω・)ノ谢谢阅读下…

Python算法题集_接雨水

本文为Python算法题集之一的代码示例 题目42:接雨水 说明:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1]…

银行数据仓库体系实践(11)--数据仓库开发管理系统及开发流程

数据仓库管理着整个银行或公司的数据,数据结构复杂,数据量庞大,任何一个数据字段的变化或错误都会引起数据错误,影响数据应用,同时业务的发展也带来系统不断升级,数据需求的不断增加,数据仓库需…

HBase入门:运行机制

文章目录 HBase 系统架构客户端ZooKeeper 服务器Master 主服务器Region 服务器 Region 服务器工作原理用户读写数据的过程缓存的刷新StoreFile合并 Store 的工作原理HLog 的工作原理 HBase 系统架构 HBase 的系统架构包括客户端、ZooKeeper 服务器、Master 主服务器、Region服…

Liunx基础-----------------------第十六章网站服务

一、概念 UI的转变:B/S框架 HYML:超文本标记语言 网页:使用HTML,PHP,JAVA语言格式书写的文件 主页:网页中呈现用户的第一个页面 网站:多个网页组合而成的一台网站服务器 URL:统…

【HarmonyOS应用开发】开发介绍 DevEco Studio安装与使用(一)

内容比较长,干货满满,全是实战操作内容,希望耐心观看,如果对你有所帮助,请点个赞! 官方文档:https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667303102887820 访…

上位机图像处理和嵌入式模块部署(c/c++ opencv)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 opencv可以运行在多个平台上面,当然windows平台也不意外。目前来说,opencv使用已经非常方便了,如果不想自己编译…

【Godot4自学手册】第七节背景搭建

各位同学,今天是第七节,在本节我会学习如何使用TileMap来完成背景搭建。 一、添加TileMap结点 先做个介绍,TileMap是基于 2D 图块的地图节点。Tilemap(图块地图)使用 TileSet,其中包含了图块的列表&#…

1、什么是特征工程

1、欢迎来到特征工程!! 在这门课程中,你将学习到构建一个优秀的机器学习模型过程中最重要的一步:特征工程。你将学习如何: 使用互信息确定哪些特征最重要在几个真实世界的问题领域中创造新的特征使用目标编码对高基数分类进行编码使用k-means聚类创建分割特征使用主成分分析…

分段函数线性化方法matlab测试

目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all; gn10;tn1; x_pfsdpvar(1, t…