掘金日新计划 · 8 月更文挑战第39天--SpringMVC拦截器(三)多拦截器

49 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第39天,点击查看活动详情

如果一个url被多个拦截器进行拦截,那么他们的顺序是怎样的呢?今天我们来学习一下拦截器链的作用,明白拦截器调用顺序的问题

1.创建拦截器MyInterceptor

image.png

package com.imooc.restful.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(request.getRequestURL() + "-准备执行");
//        response.getWriter().print("[]");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println(request.getRequestURL() + "-目标处理成功");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println(request.getRequestURL() + "-响应内容已产生");
    }
}

2.创建拦截器MyInterceptor1

image.png

package com.imooc.restful.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 {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(request.getRequestURL()+"-准备执行-1");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println(request.getRequestURL()+"-目标处理成功-1");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println(request.getRequestURL()+"-响应内容已产生-1");
    }
}

3.resources/applicationContext.xml配置两个拦截器

image.png

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/restful/**"/>
        <mvc:mapping path="/webapi/**"/>
        <mvc:exclude-mapping path="/**.ico"/>
        <mvc:exclude-mapping path="/**.jpg"/>
        <mvc:exclude-mapping path="/**.gif"/>
        <mvc:exclude-mapping path="/**.js"/>
        <mvc:exclude-mapping path="/**.css"/>
        <mvc:exclude-mapping path="/resources/**"/>
        <bean class="com.imooc.restful.interceptor.MyInterceptor1"/>
    </mvc:interceptor>
</mvc:interceptors>

4.启动应用

image.png 我们可以看到,

  • 拦截器先准备执行,接着拦截器1执行,这和拦截器配置文件的顺序有关
  • 接下来我们看到先是目标处理成功1,然后目标处理成功
  • 接着响应内容产生1,响应内容已产生 为什么会有这种情况的呢 image.png
    通过图我们可以分析到,多个拦截器的使用遵循先入后出的原则