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. Prometheus + Alertmanager 实现企微告警

    上一篇:二进制安装Prometheus  下面准备在监控的流程中呈现到告警到企微 查看企业ID,用于后续配置文件 四.安装Alertmanager1.准备安装的包 --选择上面链接给的Linux的ta ...

  2. 【SpringCloud技术专题】「原生态Fegin」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)

    前提介绍 Feign是SpringCloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用. 由于遗留原因,某些项目中,整个系统并不是SpringCloud项目,甚至不是Spri ...

  3. Windows协议 LDAP篇 - 域权限

    windows 访问控制模型 也就是大名鼎鼎的ACM,access control mode 由两部分组成的. 访问令牌(access tokens) 其中包含有关登录用户的信息(User SID,G ...

  4. 一周内被程序员疯转3.2W次,最终被大厂封杀的《字节跳动Android面试手册》!

    一眨眼又到金三银四了,不知道各位有没有做好跳槽涨薪的准备了呢? 今天的话大家分享一份最新的<字节跳动Android面试手册>,内容包含Android基础+进阶,Java基础+进阶,数据结构 ...

  5. [论文阅读] LCC-NLM(局部颜色校正, 非线性mask)

    [论文阅读] LCC-NLM(局部颜色校正, 非线性mask) 文章: Local color correction using non-linear masking 1. 算法原理 如下图所示为, ...

  6. 【笔记】浅谈支持向量机(SVM)

    SVM支持向量机 支持向量机的思想原理 使用支持向量机的思想,既可以解决回归问题,又可以解决分类问题 那么支持向量机的思想是什么? 已经知道逻辑回归这种算法的本质就是在一个平面中寻找决策边界,而分类算 ...

  7. DVWA-全等级XSS(反射型、存储型)

    DVWA简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法 ...

  8. linux中文件内核数据结构

    3.文件io 3.1 文件内核数据结构 3.2 复制文件描述符的内核数据结构 3.3 对指定的描述符打印文件标志 #include "apue.h" #include <fc ...

  9. Centos7上安装最新的nodejs

    下载nodejs包 安装wget yum install -y wget 下载nodejs到/usr/local/nodejs/下 https://cdn.npm.taobao.org/dist/no ...

  10. ASP.NET Core教程:使用Supervisor做ASP.NET Core应用程序守护进程

    一.前言 在上一篇文章中,我们讲解了如何在Linux服务器上面部署ASP.NET Core应用程序,并且使用Nginx作为反向代理.我们在Linux服务器上面,是通过ASP.NET Core自宿主的方 ...