Spring MVC拦截器

重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp、js、image、html则会放行。

什么是拦截器

运行在服务器的程序,先于Servlet或JSP之前运行实现对请求资源的拦截,可以拦截一个或多个Servlet或JSP,可以先于Servlet或JSP检查请求信息,也可以处理响应信息。

什么是SpringMVC拦截器

Spring MVC独特的拦截器,根据在Spring MVC配置文件中定义的拦截规则去拦截控制器(Controller)的请求,如果请求时jsp、js、image、html则不会拦截(这点与在web配置的DispatcherServlet所拦截的范围并不冲突

使用SpringMVC拦截器

创建SpringMVC拦截器

使用Spring MVC会导致只有一个Servlet(DispatcherServlet),所以拦截器在物理模型中处在DispatchServlet与Controller之间。要实现Spring MVC拦截器主要有两种方法,现在只介绍其中一个方法用作理解Spring MVC拦截器的作用。

实现HandlerInterceptor接口

HandlerInterceptor接口为Spring MVC提供的拦截器接口之一,所以我们来实现一个Spring MVC拦截器:

MyInterceptor:
// 定义拦截器拦截请求
public class MyIntercept implements HandlerInterceptor {
// 依赖注入
@Autowired
private MyController controller; /**
* preHandle:在DispatcherServlet请求单元方法执行之前执行,并根据该方法的返回值判断是否放行。
*
* 利用HandlerMethod对象调用当前的单元方法,只会执行方法体,但是不会返回单元方法的ModelAndView的对象,可以拿到HttpServletRequest、HttpServletResponse对象
* 进行页面的重定向或者转发
*
*
* @param httpServletRequest 由DispatcherServlet传递的httpServletRequest
* @param httpServletResponse 由DispatcherServlet传递的httpServletResponse
* @param o 这个就是HandlerMethod,是反射的另一种方式,储存了单元方法的方法对象
* @return 是否放行
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println(o instanceof HandlerMethod);
HandlerMethod hm = (HandlerMethod) o;
Method method = hm.getMethod();
method.invoke(controller,httpServletResponse);
return false;
} @Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("MyIntercept.postHandle"); } @Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("MyIntercept.afterCompletion");
}
}

根据上面代码,我们看出该接口提供了3个方法:

  • preHandles:先于单元方法执行前执行。
  • postHandle:在调用方法后解析视图前执行。
  • afterCompletion:在视图渲染后执行,即整个请求完成。

其实这三个方法的作用段很好理解。

preHandle:DispatcherServlet根据请求调用Controller中的单元方法,而拦截器此时拦截了请求,则会优先调用MyInterceptor中的preHandle方法,在此方法中判断是否对该请求放行,如果放行返回true,反之则返回false,其中的Object类型的o对象,其实是HandlerMethod对象(有需要自己百度),为什么会有这个对象呢?我的理解是不论这个请求被拦截后放不放行,咱们的用户总要得到一个结果,所以如果因为其他原因不放行,但是结果却在单元方法中得出,这个时候就可以利用HandlerMethod对象得到Method对象再反射调用单元方法得出结果响应给用户。

postHandle:如果请求放行,则会调用单元方法,当方法体执行完毕,返回视图时(ModelAndView)给视图解析器时,这个时候就会进入到postHandle中进行请求和模型数据的修改(如果有需求的话),执行完成便会将修改好的ModelAndView交给视图解析器进行解析并渲染视图。为什么需要传入ModelAndView? 有时我们可能需要对数据或者视图进行进一步调正处理,比如在固定时间段的敏感词汇,届时可能不在单元方法中进行处理,所以我们就会在此方法中进行数据处理。

afterCompletion:此方法的作用段就在视图渲染完成后调用,主要是用来对资源的关闭,比如IO流亦或者是异常的处理。

光定义了拦截器还不行,我们需要在Spring MVC的配置文件中配置咱们定义的拦截器,接下里就是配置文件了:

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

    <mvc:annotation-driven/>

    <mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/img/**" location="/img/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 配置全局拦截器,将会拦截所有的请求 -->
<bean id="all" class="com.lyl.intercept.AllIntercept"/>
<!-- 可以配置多个拦截器,并声明其拦截范围,以及定义的拦截器 -->
<mvc:interceptor>
<!-- 设置拦截器的范围 -->
<mvc:mapping path="/demo"/>
<!-- 配置拦截器的bean对象 -->
<bean id="my1" class="com.lyl.intercept.MyIntercept"/>
</mvc:interceptor> <mvc:interceptor>
<!-- 设置拦截器的范围 -->
<mvc:mapping path="/demo1"/>
<mvc:mapping path="/demo2"/>
<mvc:mapping path="/my/*"/> <!-- *标识为通配符 -->
<!-- 配置拦截器的bean对象 -->
<bean id="my1" class="com.lyl.intercept.MyIntercept"/>
</mvc:interceptor>
<!-- 可以嵌套多个拦截器,拦截器的顺序也会有所不同,将拦截器看作是环绕通知执行,方法体时自生而下,画一个物理视图就简单明了 -->
</mvc:interceptors>

Spring MVC拦截器浅析的更多相关文章

  1. SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器

    目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...

  2. spring mvc 拦截器的使用

    Spring MVC 拦截器的使用 拦截器简介 Spring MVC 中的拦截器(Interceptor)类似于 Servler 中的过滤器(Filter).用于对处理器进行预处理和后处理.常用于日志 ...

  3. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

    [Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...

  4. Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)

    拦截器 1.简介 Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现, ...

  5. Spring MVC拦截器配置

    Spring MVC拦截器配置 (1)自定义拦截器 package learnspringboot.xiao.other; import org.springframework.web.servlet ...

  6. 写的太细了!Spring MVC拦截器的应用,建议收藏再看!

    Spring MVC拦截器 拦截器是Spring MVC中强大的控件,它可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是在渲染视图后进行操作. 拦截器概述 对于任何优秀的MVC框架, ...

  7. 对于Spring MVC 拦截器的一些了解

    Spring MVC 拦截器的执行顺序 应用场景 假设请求 localhost:8080/ 则要求直接重定向到 localhost:8080/login ; 定义拦截器顺序 permission lo ...

  8. spring MVC拦截器01

    spring MVC拦截 作用:身份校验,权限检查,防止非法訪问. 场景:一个bbs系统,用户没有登录就无法发帖或者删除评论; 一个博客系统,没有登录就无法发表博文,无法添加分类,无法删除博文. sp ...

  9. spring mvc拦截器原理分析

    我的springMVC+mybatis中的interceptor使用@autowired注入DAO失败,导致报空指针错误,这个是为什么呢? :空指针说明没有注入进来,你可以检查一下你的这个拦截器int ...

随机推荐

  1. 文件包含 & LFI-labs靶场

    文件包含漏洞学习 冲冲冲,好好学习 2020.1.30 认真对待自己做出的每一个决定 知识与实践 Q:什么是文件包含? A:简单一句话,为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含 ...

  2. GooseFS助力大数据业务数倍提升计算能力

    前言 GooseFS是由腾讯云推出的一款分布式缓存方案,主要针对包括需要缓存加速的数据湖业务场景,提供基于对象存储COS服务的近计算端数据加速层. GooseFS 基于开源大数据缓存方案 Alluxi ...

  3. C++ //继承中的对象模型 //利用开发人员命令提示工具查看对象模型 //父类中所有非静态成员属性都会被 子类继承下去 //父类中私有成员属性 是被编译器给隐藏了 因此是访问不到 但是确实被继承下去了

    1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 /* 9 #include &l ...

  4. 跟你说个笑话,硕士毕业两年,月薪10k,天天面向CV编程

    "枯燥乏味的一天,又tm要开始了". 早上10:00,程序员毛毛带着路上买的早餐,打开24英寸的显示屏,去某论坛查一下昨天没有解决的bug. 9 个小时增删改查.搬砖写代码的一天又 ...

  5. 一、Ocelot简单概述

    以下只是本人学习过程的整理 Ocelot官网:http://threemammals.com/ocelot 说明文档:https://ocelot.readthedocs.io/en/latest/ ...

  6. 21JavaScript笔记(1)

    JavaScript 基于对象和事件驱动 简单描述性语言 函数优先 解释型(即时编译型) 具有安全性的脚本语言 1.js组成 核心语法(ECMAScript):开放的.标准的脚本语言规范,主要包含了语 ...

  7. 前端从😳 到🚪 gRPC 框架

    RPC 是什么? RPC 英文全称是 Remote Procedure Call 既远程过程调用,维基百科中给的定义是一个计算机调用了一个函数,但这个函数并不在这台计算机上,这种远程调用方式程序员无需 ...

  8. 入门Kubernetes-StatefulSets

    前言: 前面文中对通过DaemonSet.存储资源对象,实现了在指定节点中运行一个守护进程. 在真实的业务场景中,部署的服务都是有状态的.且有数据需要持久化的:那么如何实现呢? 那么接下来学习一种更加 ...

  9. 陀螺仪、加速度计与MPU6050的关系

    文章目录 一.引言 二.陀螺仪 三.加速度计 四.MPU6050 一.引言 要开始做俩轮平衡小车了,所以需要补充一些关于平衡小车的知识,首先就是如何让小车保持平衡,这是要依据小车当前的三轴角度和平衡位 ...

  10. STM32—时钟树(结合系统时钟函数理解)

    时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处.心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来 ...