SpringMVC的拦截器
SpringMVC的拦截器
- SpringMVC的拦截器
- 01-SpringMVC拦截器-拦截器的作用(理解)
- 02-SpringMVC拦截器-interceptor和filter区别(理解,记忆)
- 03-SpringMVC拦截器-快速入门(应用)
01-SpringMVC拦截器-拦截器的作用(理解)
- Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
- 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(InterceptorChain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。
02-SpringMVC拦截器-interceptor和filter区别(理解,记忆)
- 关于interceptor和filter的区别,如图所示:

03-SpringMVC拦截器-快速入门(应用)
(1)项目前准备
- 首先参照文章👉👉👉Spring课程工程构建➕SpringMVC简介及其快速入门搭建项目👈👈👈搭建好一个项目
itheima_spring_interceptor
, - 在创建好的项目里面根据上面的文章,依次①导入SpringMVC相关坐标、②配置SpringMVC核心控制器DispathcerServlet、③创建Controller类和视图页面、④使用注解配置Controller类中业务方法的映射地址、⑤配置SpringMVC核心文件spring-mvc.xml。
- 在项目里面
src\main\java
创建com.itheima.controller
包,然后新建一个TargetController类。
package com.itheima.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class TargetController {@RequestMapping("/target")public ModelAndView show(){System.out.println("目标资源执行......");ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("name","itcast");modelAndView.setViewName("index");return modelAndView;}
}
- 在
src\main\resources\spring-mvc.xml
里面进行配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
"><mvc:annotation-driven/><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/"/><property name="suffix" value=".jsp"/></bean><mvc:default-servlet-handler/><context:component-scan base-package="com.itheima.controller"/>
</beans>
<html>
<head><title>Title</title>
</head>
<body>
<h1>Hello World!! ${name} </h1>
</body>
</html>
(2)快速入门
- 自定义拦截器很简单,只有如下三步:
- ①、编写拦截器:创建拦截器类实现HandlerInterceptor接口,在
com.itheima.interceptor
包里创建拦截器类MyInterceptor1
package com.itheima.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor1 implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle...");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion...");}
}
- ②配置拦截器;配置:在SpringMVC的配置文件中配置
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.itheima.interceptor.MyInterceptor1"/></mvc:interceptor>
</mvc:interceptors>
- ③测试拦截器的拦截效果
- 编写测试程序测试:
- 编写Controller,发请求到controller,跳转页面

- 当拦截器的preHandle方法返回true则会执行目标资源,如果返回false则不执行目标资源;

- 拦截器中的方法执行顺序是:preHandler-------目标资源----postHandle---- afterCompletion

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle...");String param = request.getParameter("param");if ("yes".equals(param)){return true;}else {request.getRequestDispatcher("/error.jsp").forward(request,response);return false;}
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {modelAndView.addObject("name","itheima");System.out.println("postHandle...");
}

- 拦截器在预处理后什么情况下会执行目标资源,什么情况下不执行目标资源,以及在有多个拦截器的情况下拦截器的执行顺序是什么?
- 再编写一个拦截器2,
public class MyInterceptor2 implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {System.out.println("preHandle22222.....");return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {System.out.println("postHandle2222...");}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println("afterCompletion2222....");}
}
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.itheima.interceptor.MyInterceptor2"/></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.itheima.interceptor.MyInterceptor1"/></mvc:interceptor>
</mvc:interceptors>
- 结论:
当拦截器的preHandle方法返回true则会执行目标资源,如果返回false则不执行目标资源
多个拦截器情况下,配置在前的先执行,配置在后的后执行