SpringMVC 从入门到精通系列 07——SpringMVC框架中的拦截器

Posted Xiu Yan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC 从入门到精通系列 07——SpringMVC框架中的拦截器相关的知识,希望对你有一定的参考价值。


1. 拦截器概述

  1. SpringMVC框架中的拦截器用于对处理器进行 预处理后处理 的技术。
  2. 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
  3. 拦截器和过滤器的功能比较类似,有如下区别:
    1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
    2. 拦截器是 SpringMVC 框架独有的。
    3. 过滤器配置了 /*,可以拦截任何资源。
    4. 拦截器只会对控制器中的方法进行拦截。
  4. 拦截器也是AOP思想的一种实现方式
  5. 想要自定义拦截器,需要实现 HandlerInterceptor 接口。

2. 自定义拦截器步骤

  1. 创建类,实现HandlerInterceptor接口,重写需要的方法。

    1. return true 放行,执行下一个拦截器。如果没有,执行controller中的方法
    2. return false 不放行。
    public class MyInterceptor implements HandlerInterceptor {
    
        /**
         * 预处理,在controller方法执行前
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("MyInterceptor执行了。。");
            //成功放行
            return true;
            //不放行
            //request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response);
           	//return false;
        }
    }
    
  2. 在springmvc.xml中配置拦截器类。

    <!--配置拦截器-->
    <mvc:interceptors>
        <!--配置第一个拦截器-->
        <mvc:interceptor>
            <!--要拦截的方法-->
            <mvc:mapping path="/user/*"/>
            <!--不要拦截的方法-->
            <!--<mvc:exclude-mapping path=""/>-->
            <!--配置拦截器对象-->
            <bean class="com.itheima.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
    

演示如下:

工程目录:
在这里插入图片描述

Controller:

@Controller
@RequestMapping(path = "/user")
public class  UserController {

    @RequestMapping(path = "/testInterceptor")
    public String testInterceptor(){
        System.out.println("testInterceptor方法执行了");

        return "success";
    }
}

演示页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>拦截器</h3>

<a href="user/testInterceptor">拦截器</a>
</body>
</html>

成功页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<h3>执行成功</h3>

</body>
</html>

演示效果:
在这里插入图片描述
在这里插入图片描述


3. HandlerInterceptor接口中的方法

  1. preHandle 方法是controller方法 执行前拦截的方法
    1. 可以使用 request 或者 response 跳转到指定的页面
    2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
    3. return false不放行,不会执行controller中的方法。
  2. postHandle 是controller方法 执行后 执行的方法,在JSP视图执行前
    1. 可以使用request或者response跳转到指定的页面
    2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
  3. afterCompletion 方法是在 JSP执行后执行
    1. request 或者 response不能再跳转页面了

代码演示:

public class MyInterceptor implements HandlerInterceptor {

    /**
     * 预处理,在controller方法执行前
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor执行了。。。前");
        return true;
    }

    /**
     * 后处理方法,controller方法执行后,success.jsp执行之前
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor执行了。。。后");
    }

    /**
     * success.jsp执行后,该方法会执行
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor执行了。。。最后");
    }
}

成功页面输出信息:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<h3>执行成功</h3>
<%System.out.println("success.jsp");%>
</body>
</html>

演示结果:
在这里插入图片描述


4. 配置多个拦截器

<!--配置拦截器-->
<mvc:interceptors>
    <!--配置第一个拦截器-->
    <mvc:interceptor>
        <!--要拦截的方法-->
        <mvc:mapping path="/user/*"/>
        <!--不要拦截的方法-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--配置拦截器对象-->
        <bean class="com.itheima.interceptor.MyInterceptor"></bean>
    </mvc:interceptor>

    <!--配置第二个拦截器-->
    <mvc:interceptor>
        <!--要拦截的方法-->
        <mvc:mapping path="/user/*"/>
        <!--不要拦截的方法-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--配置拦截器对象-->
        <bean class="com.itheima.interceptor.MyInterceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

拦截顺序是 根据配置里面的拦截顺序进行拦截,放行也是从最深处向外放行,具体图示如下:

在这里插入图片描述

演示效果如下:
在这里插入图片描述

以上是关于SpringMVC 从入门到精通系列 07——SpringMVC框架中的拦截器的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC 从入门到精通系列 07——SpringMVC框架中的拦截器

SpringMVC 从入门到精通系列 01——SpringMVC 概述与入门案例

SpringMVC 从入门到精通系列 05——SpringMVC 实现文件上传

SpringMVC 从入门到精通系列 03——常用注解

SpringMVC 从入门到精通系列 04——响应数据和结果视图

SpringMVC 从入门到精通系列 02——请求参数的绑定