侧边栏壁纸
博主头像
张种恩博主等级

一个能运维的 JPG 搬运工

  • 累计撰写 703 篇文章
  • 累计创建 60 个标签
  • 累计收到 24 条评论

SpringMVC(11)之拦截器

张种恩
2017-12-31 / 0 评论 / 0 点赞 / 309 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2020-02-25,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

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

0

评论区