java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringMVC拦截器

SpringMVC框架自定义拦截器的过程详解

作者:好好研究

文章主要介绍了SpringMVC框架中的拦截器及其工作原理,包括拦截器的定义、执行流程、与过滤器的区别,以及如何自定义和配置拦截器,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

一、拦截器

1. 概述

  1. SpringMVC框架中的拦截器用于对处理器(Controller层)进行预处理后处理的技术。
  2. 可以定义拦截器链,拦截器链就是将拦截器按着一定顺序结成一条链,在访问被拦截的方法中,拦截器链中的拦截器会按着定义的顺序执行
  3. 拦截器也是AOP思想的一种实现方法。
  4. 想要自定义拦截器,需要实现HandlerInterceptor接口

2. HandlerInterceptor接口中的方法

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

3. 拦截器执行流程图

4. 拦截器和过滤器的区别

  1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器。
  2. 拦截器是SpringMVC框架独有的。
  3. 过滤器配置/*,可以拦截任何资源。
  4. 拦截器只会对控制器中的方法进行拦截

二、自定义拦截器

1. 配置一个拦截器

处理器(Controller层)中的方法

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/dept")
@Controller
public class DeptController {
    /**
     * 测试方法
     * @return
     */
    @RequestMapping("/findAll.do")
    public String findALL(){
        System.out.println("测试拦截器,执行了……");
        return "suc";
    }
}

创建拦截器类,实现HandlerInterceptor接口,重写需要的方法

<!--配置拦截器们-->
<mvc:interceptors>
    <!--配置拦截器1-->
    <mvc:interceptor>
        <!--拦截哪些资源-->
        <mvc:mapping path="/dept/**"/>
        <!--不拦截哪些资源-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--拦截器对象-->
        <bean class="com.qcby.demo4.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

在springmvc.xml文件中配置拦截器

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 拦截器类
 */
public class MyInterceptor implements HandlerInterceptor {
    /**
     * 拦截器之前:拦截controller中的findAll方法,放行,执行controller中的方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor中的拦截器preHandle方法执行了……");
        // return false - 拦截,不放行;return true - 拦截,放行
        return true;
    }
    /**
     * 拦截器之后:controller方法执行后,要拦截的方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor中的postHandle方法执行了……");
        // 可以进行页面跳转
        request.getRequestDispatcher("/pages/suc.jsp").forward(request,response);
        return;
    }
    /**
     * controller跳转的jsp页面都执行完成了,最后执行该方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor中的afterComplrtion方法执行了……");
    }
}

输出结果:

MyInterceptor中的拦截器preHandle方法执行了……
测试拦截器,执行了……
MyInterceptor中的postHandle方法执行了……
MyInterceptor中的afterComplrtion方法执行了……

2. 配置多个拦截器

再编写一个拦截器类

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 拦截器类
 * 配置多个拦截器
 */
public class MyInterceptor2 implements HandlerInterceptor {
    /**
     * 拦截controller中的方法,但放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor2的拦截器preHandle方法执行了……");
        // 放行
        return true;
    }
    /**
     * controller方法执行后,要拦截的方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor2的postHandle方法执行了……");
    }
    /**
     * controller跳转的jsp页面都执行完成了,最后执行该方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor2的afterComplrtion方法执行了……");
    }
}

再springmvc.xml文件中配置多个拦截器类

<!--配置拦截器们-->
<mvc:interceptors>
    <!--配置拦截器1-->
    <mvc:interceptor>
        <!--拦截哪些资源-->
        <mvc:mapping path="/dept/**"/>
        <!--不拦截哪些资源-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--拦截器对象-->
        <bean class="com.qcby.demo4.MyInterceptor"></bean>
    </mvc:interceptor>
    <!--配置拦截器2-->
    <mvc:interceptor>
        <!--拦截哪些资源-->
        <mvc:mapping path="/**"/>
        <!--拦截器对象-->
        <bean class="com.qcby.demo4.MyInterceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

输出结果

MyInterceptor中的拦截器preHandle方法执行了……
MyInterceptor2的拦截器preHandle方法执行了……
测试拦截器,执行了……
MyInterceptor2的postHandle方法执行了……
MyInterceptor中的postHandle方法执行了……
MyInterceptor2的afterComplrtion方法执行了……
MyInterceptor中的afterComplrtion方法执行了……

到此这篇关于SpringMVC框架 - 拦截器的文章就介绍到这了,更多相关SpringMVC拦截器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文