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. 01_安装电脑软件的步骤批处理脚本.bat

    REM 01_安装电脑软件的步骤批处理脚本.bat MD 01_安装电脑软件的步骤 REM ZIP解压密码空格MD 02_制作杏雨梨云USB维护系统2019中秋版之国庆更新固态U盘MD 03_复制安装 ...

  2. Python爬虫+可视化教学:爬取分析宠物猫咪交易数据

    前言 各位,七夕快到了,想好要送什么礼物了吗? 昨天有朋友私信我,问我能用Python分析下网上小猫咪的数据,是想要送一只给女朋友,当做礼物. Python从零基础入门到实战系统教程.源码.视频 网上 ...

  3. Java基础——类型转换注意事项及常见问题

    类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用类型转换 低------------------------------------------------------------ ...

  4. 常见的嵌入式linux学习和如何选择ARM芯片问答

    常见的ARM嵌入式学习问答,设计者和学习者最关心的11个问题: 1.          ARM嵌入式是学习硬件好还是学习软件好? 2.          嵌入式软件和硬件,哪一种职位待遇更高?或者说, ...

  5. 基于SpringBoot的药店管理系统java药房管理系统(源码+数据库文件+文档)

    注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SpringBoot 前端技术:HTML+CSS+JavaScript+Bootstrap+jQue ...

  6. Shell-13-常用文件目录

    linux系统目录结构 环境变量文件 系统级 系统级变量文件对所有用户生效 #系统范围内的环境变量和启动文件. #不建议把要做的事情写在这里面,最好创建一个自定义的,放在/etc/profile.d ...

  7. Java基础技术基础面试【笔记】

    Java基础技术基础面试[笔记] String.StringBuilder以及StringBuffer三者之间的区别? 三者的区别可以从可变性,线程安全性,性能这三个部分进行说明 可变性 从可变性来说 ...

  8. 位(bit)、字节(Byte)、字(Word)、双字(Dword)之间的关系

    位(bit): bit(简写:b),是计算机数据存储最小的单位,二进制中,0或者1就是一个位(比特位)bit. 字节: Byte(简写:B),是计算机信息技术用于计量存储容量的一种计量单位,通常情况下 ...

  9. 003 TCP/IP协议详解(一)

    TCP/IP TCP/IP 意味着 TCP 和 IP 在一起协同工作. TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信. IP 负责计算机之间的通信. TCP 负责将数据分割并装入 IP ...

  10. Nikitosh 和异或

    题面 设 \(l_{i}\) 为以 \(i\) 为结尾的区间中最大的一段异或值,\(r_{i}\) 为以 \(i\) 为开头的区间中最大的一段异或值. 则有 \[l_{i}=\max\left(l[i ...