SpringMVC(11)之拦截器

SpringMVC(11)之拦截器

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

介绍

SpringMVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。

拦截器依赖于 Web 框架,在 SpringMVC 中就是依赖于 SpringMVC 框架。在实现上基于 Java 的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于 Web 框架的调用,因此可以使用 Spring 的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 Controller 生命周期之内可以多次调用。但是缺点是只能对 Controller 请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

自定义拦截器

1、定义拦截器 1:

// com.zze.springmvc.web.interceptor.MyInterceptor1
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("MyInterceptor.preHandle");
        return true; // true:放行 false:拦截
    }

    /**
     * 处理器执行后, modelAndView 返回前执行
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor.postHandle");
    }

    /**
     * 处理器执行后执行
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor.afterCompletion");
    }
}

2、定义拦截器 2:

// com.zze.springmvc.web.interceptor.MyInterceptor2
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 {
    /**
     * 处理器执行前执行
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor.preHandle");
        return true; // true:放行 false:拦截
    }

    /**
     * 处理器执行后, modelAndView 返回前执行
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor.postHandle");
    }

    /**
     * 处理器执行后执行
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor.afterCompletion");
    }
}

3、注册拦截器:

<!-- config/spring/springmvc.xml -->
<!--注册拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--拦截所有请求,包括二级以上目录-->
        <mvc:mapping path="/**"/>
        <!--指定路径不拦截-->
        <mvc:exclude-mapping path="/login"/>
        <bean class="com.zze.springmvc.web.interceptor.MyInterceptor1"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.zze.springmvc.web.interceptor.MyInterceptor2"/>
    </mvc:interceptor>
</mvc:interceptors>

4、编写测试 Controller:

// com.zze.springmvc.web.controller.TestController
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

    @RequestMapping("test")
    public void test() {
        System.out.println("from TestController.test");
    }
}

5、测试,浏览器访问 localhost:8080/test 控制台输出如下:

image.png

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/springmvc11.html

Buy me a cup of coffee ☕.