【SpringMVC从看懂到看开】8 - 拦截器

13 拦截器

13.1 SpringMVC中的拦截器

  • 拦截器 Interceptor 拦截器相当于Servlet中的过滤器,能够对请求进行一些预处理和后期处理。
  • 拦截器和过滤器的区别:SpringMVC的拦截器应用了AOP
    • 过滤器是Servlet规范的一种,任何JavaWeb应用都可以使用
    • 过滤器可以过滤所有请求
    • 拦截器是SpringMVC框架的一部分,只能在该框架内使用
    • 拦截器只会拦截访问控制器内的方法,对于请求HTML、JSP等其他资源无法进行拦截(毕竟AOP只增强方法)

13.2 拦截器的使用

拦截器使用的步骤:

  1. 实现HandlerInterceptor接口
  2. 实现三个方法
    • preHandle
    • postHandle
    • afterHandle
  3. 在spring元数据配置文件中配置拦截器

拦截器执行过程图如下:
在这里插入图片描述

13.3 自定义一个拦截器

  1. 定义一个控制器
@Controller
public class HandleInterceptorController {

    @RequestMapping("/hic/t1")
    public String tester(Model model){
        model.addAttribute("msg","Hello Test.jsp");
        return "test";
    }
}
  1. 定义要跳转的视图test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>${msg}</h1>

</body>
</html>
  1. 自定义一个拦截器,继承HandlerInterceptor接口
package com.cap.config;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author cap
 * @create 2020.07.19.9:54
 */
public class MyInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器preHandle");
        return true;
    }

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

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器afterCompletion");
    }
}
  1. 在Spring元数据配置文件applicationContext.xml中配置拦截器
    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 表示拦截某请求下的所有请求,比如/admin/login -->
            <mvc:mapping path="/**"/>
            <bean class="com.cap.config.MyInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

注意path这里是/**,表示拦截某一路径请求下及其所有路径的请求
如果是/admin/**,表示拦截/admin路径请求下的所有请求

  1. 测试
    在这里插入图片描述控制台输出:
拦截器preHandle
拦截器postHandle
拦截器afterCompletion

当我们把preHandler方法改为false,控制台会输出

拦截器preHandle

这里也可以说明当preHandle返回值为false时,那么它就不会走postHandleafterHandle方法

猜你喜欢

转载自blog.csdn.net/Cap220590/article/details/107441399