Spring学习笔记<四> AOP 拦截器的基本实现

本文详细介绍如何在SpringMVC项目中使用拦截器,并通过实例演示了多个拦截器的配置及执行顺序。包括自定义拦截器类、控制器方法以及springmvc.xml配置文件的具体设置。
1.添加文件

继续在《 Spring学习笔记<三> 获取请求对象和请求头》的项目基础上再添加三个文件:

test_Interceptor.jsp文件(WebContent文件夹下面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>helloWorld</title>
</head>
<body>

    <a href="testInterceptor">testInterceptor</a>
    <br/><br/>

    <a href="testSecondInterceptor">testSecondInterceptor</a>
    <br/><br/>

</body>
</html>

InterceptorTest.java文件(com.shi.springmvc.interceptors包下面)

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class InterceptorTest {

    private String SUCCESS = "success";

    @RequestMapping(value = "/testInterceptor")
    public String testInterceptor() {
        System.out.println("testInterceptor被执行");
        return SUCCESS;
    }

    @RequestMapping(value = "/testSecondInterceptor")
    public String testSecondInterceptor() {
        System.out.println("testSecondInterceptor被执行");
        return SUCCESS;
    }

}

还有两个实现了HandlerInterceptor接口的拦截器对象,在实现的三个方法中分别打印当前方法被执行了,以方便我们查看这些方法是否执行以及执行的顺序。
FirstInterceptor.java对象文件(com.shi.springmvc.interceptors包下面)

public class FirstInterceptor implements HandlerInterceptor {

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

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("FirstInterceptor:postHandle被执行");

    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("FirstInterceptor:preHandle被执行");
        return true;
    }

}

SecondInterceptor.java对象文件(com.shi.springmvc.interceptors包下面)

public class SecondInterceptor implements HandlerInterceptor {

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

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("SecondInterceptor:postHandle被执行");

    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("SecondInterceptor:preHandle被执行");
        return true;
    }

}
2. HandlerInterceptor接口

  Spring MVC中对于一个请求可以添加多个拦截器,而这个拦截器集合中会链式调用这些拦截器。每个拦截器会执行固定顺序的方法,而这些方法就定义在HandlerInterceptor类中。这是拦截器的一个基础接口,里面有三个方法,分别是:

  • boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

      使用时机:在处理请求之前

      应用场景:可以在该方法中放入一些初始化的操作,比如权限验证,日志管理等

      注意:该方法的返回值是boolean类型,若返回值为true,则继续调用后面的拦截器和目标方法,若返回为false,则不会调用后面的拦截器和目标方法,表示请求结束

  • void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception;

      使用时机:在调用目标方法之后,渲染视图之前被调用。具体来说,是在调用了Controller中定义的方法之后,但在DispatcherServlet 处理视图返回渲染结果之前被调用。

      应用场景:根据使用的时机就可以知道,该方法可以对Controller处理之后ModelAndView进行操作

      注意:当有多个interceptor的时候,对于preHandler的调用顺序和postHandler的调用顺序是恰恰想法的。

      举例来说,现在有一个FirstInterceptor和一个SecondInterceptor,单独调用FirstInterceptor的三个方法的顺序为:

        FirstInterceptor.preHandle->HandlerAdapter.handle->FirstInterceptor.postHanle->DispatcherServlet.render->FirstInterceptor.afterCompletion。

      对于两个interceptor的调用顺序大致如下:

      可以总结出preHandler是先进先执行,而postHandler是先进后执行

  • void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception;

      使用时机:渲染视图之后

      应用场景:释放资源

3.然后在springmvc.xml文件中添加:
    <mvc:interceptors>
        <bean class="com.shi.springmvc.interceptors.FirstInterceptor"></bean>

        <mvc:interceptor>
            <!-- 特定请求拦截器,只拦截path=testSecondInterceptor的请求 -->
            <mvc:mapping path="/testSecondInterceptor" />
            <bean class="com.shi.springmvc.interceptors.SecondInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

我们在配置文件配置拦截器FirstInterceptor和SecondInterceptor,并指定SecondInterceptor只对path=”/testSecondInterceptor”的请求进行拦截。

好了,看一下效果图:
效果图

最后附上demo下载地址:戳我进入

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值