Spring 全家桶之 Spring Web MVC(七)- Interceptor

简介: Spring 全家桶之 Spring Web MVC(七)- Interceptor

一、拦截器

Spring MVC提供了拦截器机制,允许在运行目标方法前进行一些拦截工作,或者在目标方法运行之后进行一些其他处理

Spring MVC 中的拦截器是HandlerInterceptor接口,该接口包含了三个方法

image.png

  • preHandler:这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求进行处理,如果需要该拦截器对请求进行拦截处理后还要调用其他拦截器,或者是业务处理器进行处理,则返回True既放行请求,如果不需要再调用其他组件就返回false,既不放行请求
  • postHandler:这个方法在业务处理器处理完成请求后调用,但是DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求request进行处理
  • afterCompletion:这个方法在DispatcherServlet完全处理请求后被调用,可以在该方法中进行一些资源清理的操作

二、自定义拦截器

拷贝spring-mvc-ajax项目,并重命名为spring-mvc-handler,删除除了配置之外的类及文件。

拦截器的正常流程

新建一个HandlerInterceptorSamplerController,在该Controller中定义interceptor方法,测试自定义的拦截器,并返回success页面

@Controller
public class HandlerInterceptorSamplerController {
    @RequestMapping("/interceptor")
    public String interceptor(){
        System.out.println("interceptor方法被调用");
        return "success";
    }
}
复制代码

在index.jsp页面增加一个超链接

<a href="/interceptor">拦截该请求</a>
复制代码

新增interceptor包,新建一个自定义的拦截器ZuluInterceptor,自定义拦截器必须实现HandlerInterceptor接口,在拦截器中的每个方法中添加了日志打印

public class ZuluInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(this.getClass().getName() + " preHandler方法运行了");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println(this.getClass().getName() + " postHandle方法运行了");
        System.out.println(modelAndView.getViewName());
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println(this.getClass().getName() + " afterCompletion方法运行了");
    }
}
复制代码

在Spring MVC 配置文件中注册拦截器,配置这个拦截器拦截哪些请求

<mvc:interceptors>
    <!--第一种方式配置某个拦截器,默认是拦截所有请求的-->
    <bean class="com.citi.interceptor.ZuluInterceptor"></bean>
</mvc:interceptors>
复制代码

启动应用,点击首页的超链接

image.png

根据控制台的输出,自定义的拦截器被成功调用

因此拦截器的正常流程是:拦截器preHandler方法 -> 目标方法 -> 拦截器的postHandler方法 -> 页面渲染 -> 拦截器的afterCompletion方法

拦截器的异常流程

异常流程1 - preHandler返回false

在ZuluInterceptor拦截器的preHandler方法返回false,再次启动,点击首页的超链接

image.png

控制台只输出了preHandler方法的执行信息,因此只要preHandler返回false,既不放行就不会有以后的方法的执行。

异常流程2 - 其他异常

保持preHandler方法返回true,同时在Controller中的interceptor方法返回页面前增加异常代码

@RequestMapping("/interceptor")
public String interceptor(){
    System.out.println("interceptor方法被调用");
    // 异常代码
    int i = 10 / 0;
    return "success";
}
复制代码

再次重新启动应用,点击页面的超链接

image.png

页面出现有异常代码导致的报错

image.png

此时控制台执行了afterCompletion方法

三、多个拦截器执行顺序

在interceptor包中拷贝ZuluInterceptor并重命名为DeltaInterceptor;在Spring MVC配置文件中注册新定义的拦截器

<mvc:interceptors>
    <!--第一种方式配置某个拦截器,默认是拦截所有请求的-->
    <bean class="com.citi.interceptor.ZuluInterceptor"></bean>
    <bean class="com.citi.interceptor.DeltaInterceptor"></bean>
</mvc:interceptors>
复制代码

将Controller中的interceptor方法中的异常代码注销,重新启动,点击页面的插连接

image.png

根据控制台的输出可以确定,限制性了Zulu拦截器中的preHandler方法,接着执行Delta拦截器的preHandler方法,再执行目标方法,接着调用Delta拦截器的postHandler,再执行Zulu拦截器的postHandler,再执行Delta拦截器的afterCompletion方法,最后再执行Zulu拦截器的afterCompletion方法

拦截顺序:拦截器拦截顺序是按照配置的先后顺序,调整拦截器配置顺序

<mvc:interceptors>
    <!--第一种方式配置某个拦截器,默认是拦截所有请求的-->
    <bean class="com.citi.interceptor.DeltaInterceptor"></bean>
    <bean class="com.citi.interceptor.ZuluInterceptor"></bean>
</mvc:interceptors>
复制代码

再次启动,点击首页的超链接

image.png

根据控制台输出,配置文件中先配置的Delta拦截器最先执行了

多个拦截器的异常流程:

保持Spring MVC配置文件中Delta拦截器在前,Zulu拦截器在后的顺序。如果Delta拦截器不放行,也就没有后面所有的调用;如果Zulu拦截器不放行,会是什么结果?

在Zulu拦截器中返回false,重新启动应用,并点击首页的超链接

image.png

根据控制台的输出可以确定,即是Zulu拦截器不放行,但是Delta的afterCompletion方法还是会执行。

已放行了的拦截器的afterCompletion方法总会执行


相关文章
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
57 2
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
119 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
2月前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
64 7
|
2月前
|
前端开发 测试技术 开发者
MVC模式在现代Web开发中有哪些优势和局限性?
MVC模式在现代Web开发中有哪些优势和局限性?
下一篇
无影云桌面