Spring MVC 拦截器的使用

拦截器简介

Spring MVC 中的拦截器(Interceptor)类似于 Servler 中的过滤器(Filter)。用于对处理器进行预处理和后处理。常用于日志记录、权限管理、性能监控、通用行为等。

拦截器的实现

Spring MVC 中的拦截器需要我们手动实现和配置。拦截器可以通过以下两种方式定义

  • 实现 HandleInterceptor 接口,或者继承该接口的实现类如 HandleInterceptorAdapter 来定义一个拦截器;
  • 实现 WebRequestInterceptor 接口来定义一个拦截器;

HandleInterceptor 接口

我们主要讲解下实现 HandleInterceptor 接口来创建拦截器。HandleInterceptor 接口定义了三个方法,分别为 preHandle() , postHandle() , afterCompletion(),我们需要重写这三个方法,从而来实现我们定义拦截器的目的。

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handle):该方法在请求处理前调用。Spring MVC 中的拦截器是链式调用的,一个请求可以被多个拦截器拦截,但是 Interceptor 会根据被声明的次序依次被调用执行,而不会同时去拦截。而且所有 Interceptor 中的 preHandle 函数都会最先被调用,所以这个方法中可以进行一些前置初始化操作或者是对当前请求的预处理,或者设置一些判断来决定该请求是否执行下去。该方法的返回值是布尔值,当它返回 true 时,之后的 Interceptor 和 controller 都不会执行下去了;当它返回 false 时,就会继续调用下一个 Interceptor 的 preHandle 方法或者处理当前请求的 Controller

  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView):该方法只有在 perHandle 方法返回值为 true 时,在 Controller 执行完当前请求后才会执行。咋一看好像和之后要介绍的 afterCompletion 方法没有不同,但是这个方法会在 DispatcherServlet 进行视图渲染之前被调用,所以咱们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作。

  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex):该方法在整个请求结束后,也就是 DispatcherServlet 渲染了对应视图之后执行,这个方法的主要作用是用于进行资源清理的工作。

假设我们现在定义了两个拦截器,xml 配置文件中配置顺序如下内容如下:

<!-- 拦截器1 -->
<mvc:interceptor>
<!--配置拦截器的作用路径-->
<mvc:mapping path="/**"/>
<bean class="com.jojo.test.interceptor.Intercptor1"/>
</mvc:interceptor>
<!--拦截器2-->
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean class="com.jojo.test.interceptor.Interceptor2"/>
</mvc:interceptor>

那么这两个拦截器中的处理方法和请求的处理方法的顺序如下图:

实际应用举例

实现开发中,我们会要求一些页面需要登录后才能访问。未登录状态是无法得到访问权限的。这一小功能我们可以直接通过安全框架,类似 Spring Security 或者 shiro 来实现,不过我们现在利用 Spring MVC 这一功能来实现一下:

public class LoginInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {

        User user = (User) httpServletRequest.getSession().getAttribute("user");

        if (user == null) {
// 用户未登录,重定向到登录页
httpServletResponse.sendRedirect("/login");
return false;
} return true;
} public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { }
} public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { }
}

我们还需要在 spring-mvc 中配置拦截器

<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/static/**"/>
<mvc:exclude-mapping path="/login"/>
<bean class="com.jojo.test.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

相关配置说明:

  • mvc:interceptor:定义一个拦截器

    • mvc:mapping:定义需要被拦截的路径
    • mvc:exclude-mapping:定义需要排除拦截的请求路径
    • bean class:指定拦截器对象

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. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

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

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

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

  4. Spring MVC拦截器配置

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

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

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

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

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

  7. Spring MVC拦截器浅析

    Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...

  8. spring MVC拦截器01

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

  9. spring mvc拦截器原理分析

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

随机推荐

  1. Elevate Web Builder for Web Developers(类似于unigui的东西)

    推荐一款pascal 语言的web 开发工具 这几天仔细研究了一款使用Pascal 语言开发web 的工具 具体介绍可以参照这里. 先上几张他开发的页面照.

  2. Qt for android触摸手势事件QGestureEvent

    在触摸设备上可以使用Qt的手势事件 要激活手势事件,需要执行以下操作: 第一步,为QWidget控件注册手势事件 QList<Qt::GestureType> gestures; gest ...

  3. dedecms自学

    [dedecms笔记] index.htm                        主页模板head.htm                         列表头部模板footer.htm   ...

  4. spring之@value详解二(转载)

    1.1 前提 测试属性文件:advance_value_inject.properties server.name=server1,server2,server3 #spelDefault.value ...

  5. NSCache缓存怎么来的

    什么是NSCache NSCache主要用来存储临时数据(键值对),当内存资源不够时,系统会自动释放部分数据.它有三个特点: • NSCache为了保持不占用过多的系统内存,它有多种自动回收内存策略: ...

  6. spring boot 2.x 系列 —— spring boot 整合 dubbo

    文章目录 一. 项目结构说明 二.关键依赖 三.公共模块(boot-dubbo-common) 四. 服务提供者(boot-dubbo-provider) 4.1 提供方配置 4.2 使用注解@Ser ...

  7. webpack打包工具的初级使用方法

    这里下载的是webpack的3.8.1版本(新版更新的使用有些问题) 什么是webpack? 他是一个前端资源加载或打包工具,. 资源: img css json等. 下载的话 用 npm webpa ...

  8. Spring Boot使用MyBatis Generator、Swagger

    MyBatis是Java目前主流的ORM框架,在Spring Boot中使用MyBatis可以参考这篇文章:http://www.ityouknow.com/springboot/2016/11/06 ...

  9. Appium+python自动化(十三)- 与Capability完美懈垢之解读(超详解)

    简介 Capability又叫Appium Desired Capabilities,前边写了那么多实例代码,小伙伴可以发现一些规律,就是有一部分代码总是重复的出现在你的视线中.这部分就是对Capab ...

  10. Python基础(九) 常用模块汇总

    3.8 json模块重点 json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去. 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串.(比如Python的一个列 ...