Spring MVC拦截器浅析
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拦截器浅析的更多相关文章
- SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器
目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...
- spring mvc 拦截器的使用
Spring MVC 拦截器的使用 拦截器简介 Spring MVC 中的拦截器(Interceptor)类似于 Servler 中的过滤器(Filter).用于对处理器进行预处理和后处理.常用于日志 ...
- 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
[Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...
- Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)
拦截器 1.简介 Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现, ...
- Spring MVC拦截器配置
Spring MVC拦截器配置 (1)自定义拦截器 package learnspringboot.xiao.other; import org.springframework.web.servlet ...
- 写的太细了!Spring MVC拦截器的应用,建议收藏再看!
Spring MVC拦截器 拦截器是Spring MVC中强大的控件,它可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是在渲染视图后进行操作. 拦截器概述 对于任何优秀的MVC框架, ...
- 对于Spring MVC 拦截器的一些了解
Spring MVC 拦截器的执行顺序 应用场景 假设请求 localhost:8080/ 则要求直接重定向到 localhost:8080/login ; 定义拦截器顺序 permission lo ...
- spring MVC拦截器01
spring MVC拦截 作用:身份校验,权限检查,防止非法訪问. 场景:一个bbs系统,用户没有登录就无法发帖或者删除评论; 一个博客系统,没有登录就无法发表博文,无法添加分类,无法删除博文. sp ...
- spring mvc拦截器原理分析
我的springMVC+mybatis中的interceptor使用@autowired注入DAO失败,导致报空指针错误,这个是为什么呢? :空指针说明没有注入进来,你可以检查一下你的这个拦截器int ...
随机推荐
- 创建函数,传递一个数字n,返回斐波那契数列的第n的值。
斐波那契数列 第1项和第2项的值是1,从第3项开始,每项的值是前两项相加的和 1 1 2 3 5 8 13 21...... 法1: function fn(n) ...
- SpringBoot | 3.2 整合MyBatis
目录 前言 1. 导入MyBatis场景 1.1 初始化导向 1.2 手动导入 2. *MyBatis自动配置原理 3. 全局配置文件 @Mapper @MapperScan 3.1 配置模式 3.2 ...
- 【Android】真机调试新姿势:无线连接
由于工作需要,需要无线连接手机调试,特意百度了一下 在进行Android开发时,一般我们都是用usb线把手机和电脑连接起来进行调试工作.但如果你觉得这样不够酷的话,可以尝试一下无线连接,颇简单,GO! ...
- Sqli-labs 注入靶场(1-22)
Sqli-labs靶场1-22 Sql注入的本质是代码和数据的未分离,导致用户的输入可以对数据库产生恶意的输入或输出. 本篇博客旨在通过Sqli-labs的第1-22关,详细的描述Sql注入的相关场景 ...
- 单机版搭建kubernetes(K8s)
准备 云原生的概念越来越火,忍不住去看了看kubernetes,初次接触,晕晕乎乎的,于是不管三七二十一,先搭建个单机版的再说(没钱买服务器,目前也懒得装虚拟机),跑起来也算是第一步吧.网上教程一顿搜 ...
- 基于ScheduledExecutorService的并发定时任务处理能力测试
测试代码 定时器类 package business.util; import java.util.concurrent.Executors; import java.util.concurrent. ...
- Python语言系列-01-入门
python的出生与应用 #!/usr/bin/env python3 # author:Alnk(李成果) """ 1,python的出生与应用 python的创始人为 ...
- 一次关于shiro反序列化漏洞的思考
0x01前言 之前在我反序列化的那篇文章中(https://www.cnblogs.com/lcxblogs/p/13539535.html),简单说了一下反序列化漏洞,也提了一嘴常见的几种Java框 ...
- HDFS 09 - HDFS NameNode 的高可用机制
目录 1 - 为什么要高可用 2 - NameNode 的高可用发展史 3 - HDFS 的高可用架构 3.1 Standby 和 Active 的命名空间保持一致 3.2 同一时刻只有一个 Acti ...
- 你真的熟悉ASP.NET MVC的整个生命周期吗?
一.介绍 我们做开发的,尤其是做微软技术栈的,有一个方向是跳不过去的,那就是MVC开发.我相信大家,做ASP.NET MVC 开发有的有很长时间,当然,也有刚进入这个行业的.无论如何,如果有人问你,你 ...