天天看点

SpringMVC学习笔记(八)--拦截器一、实现原理二、栗子三、通配符四、多个拦截器

目录

一、实现原理

二、栗子

2.1 思路分析

2.2 代码展示 

2.3 结果展示

三、通配符

四、多个拦截器

4.1 第一个放行,第二个不放行

4.2 两个都放行

4.3 第一个不放行,第二个则无效

一、实现原理

我们先回顾一下springMVC流程图,前置控制器向处理器映射器发请求查找处理器后,返回的是一个执行链(包括一系列的拦截器)。Spring MVC中拦截器类似于Servlet中的过滤器,用于对处理器的预处理或者后处理。其拦截器的接口是:HandlerInterceptor。

 在企业开发,使用拦截器实现用户认证(用户登陆后进行身份校验拦截),用户权限拦截和方法性能监控等。

SpringMVC学习笔记(八)--拦截器一、实现原理二、栗子三、通配符四、多个拦截器

二、栗子

2.1 思路分析

方法一:

定义一个类,实现HandlerInterceptor接口。

  1. 定义一个类,实现HandlerInterceptor接口
  2. 实现接口的三个方法preHandle、postHandle、afterCompletion
  3. 配置核心文件dispatch-servlet.xml

preHandle:进入处理器之前执行,拦截作用。通常用于身份认证、授权。

postHandle:进入控制器之后,返回ModelAndView之前。从ModelAndView出发 ,可以传数据到页面,可以指定统一的视图,比如淘宝的菜单栏导航。

afterCompletion:控制器执行完之后。通常用于异常处理、日志处理。

方法二:

继承实现了HandlerInterceptor接口的类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorAdapter。

2.2 代码展示 

MyInterceptor.java

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("before......");
        return true;//放行
//        return false;//不放行
    }

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

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("after......");
    }
}
           

dispatch-servlet.xml

<!--拦截器配置-->
    <mvc:interceptors>
        <!--一个拦截器-->
        <mvc:interceptor>
            <!--所有目录下的*.do-->
            <mvc:mapping path="/**"/>
            <!--登录不能拦截-->
            <mvc:exclude-mapping path="/**/login.do"></mvc:exclude-mapping>
            <!--new MyInterceptor()-->
            <bean class="com.jc.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
           
SpringMVC学习笔记(八)--拦截器一、实现原理二、栗子三、通配符四、多个拦截器

2.3 结果展示

SpringMVC学习笔记(八)--拦截器一、实现原理二、栗子三、通配符四、多个拦截器

三、通配符

SpringMVC学习笔记(八)--拦截器一、实现原理二、栗子三、通配符四、多个拦截器

四、多个拦截器

SpringMVC学习笔记(八)--拦截器一、实现原理二、栗子三、通配符四、多个拦截器

MyInterceptor2.java 

public class MyInterceptor2 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("before2......");
        return false;//不放行
    }

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

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("after2......");
    }
}
           

4.1 第一个放行,第二个不放行

只要有一个不放行,就不会执行postHandle方法

SpringMVC学习笔记(八)--拦截器一、实现原理二、栗子三、通配符四、多个拦截器

4.2 两个都放行

SpringMVC学习笔记(八)--拦截器一、实现原理二、栗子三、通配符四、多个拦截器

4.3 第一个不放行,第二个则无效

SpringMVC学习笔记(八)--拦截器一、实现原理二、栗子三、通配符四、多个拦截器