【SpringMvc】的拦截器

本文详细介绍了SpringMVC中的拦截器机制,包括如何编写拦截器、拦截器的工作原理及配置方式。通过示例展示了拦截器在处理请求前后的三个阶段如何发挥作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.SpringMVC的拦截器
SpringMvc处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。当收到请求时,DispatcherServlet将请求交给处理器映射(HandlerMapping),让它找出对应请求的HandlerExecutionChain对象。HandlerExecutionChain是一个执行链,它包含一个处理该请求的处理器(Handler),同时可以包含若干个对该请求实施拦截的拦截器(HandlerInterceptor)。当HandlerMapping返回HandlerExecutionChain后,DispatcherServlet将请求交给定义在HandlerExecutionChain中的拦截器和处理器一并处理。HandlerExecutionChain是负责处理请求并返回ModelAndView的处理执行链,其结构如下图所示。请求在被Handler执行的前后,链中装配的HandlerInterceptor会实施拦截操作。
这里写图片描述

拦截器代码编写,需要实现HandlerInterceptor接口

public class SpringMvcInterceptor implements HandlerInterceptor{

    /**
     * 在请求到达Handler之前,先执行这个前置处理方法。当该方法返回false时,请求直接返回,不会传递到链中
     * 下一个拦截器,更不会调用处理器链末端的Handler中,只有返回true时请求才向链中的下一个处理节点传递。
     * SpringMvc中的拦截器是链式的,可以同时存在多个interceptor,springmvc会根据声明的前后顺序一个
     * 接一个的执行,且所有的interceptor中的preHandle方法都会在。
     */
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2) throws Exception {
        // TODO Auto-generated method stub
        return true;
    }

    /**
     * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 
     * 可在modelAndView中加入数据,比如当前时间
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {
        // TODO Auto-generated method stub

    }

    /**
     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源、可记录操作日志等
     * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
     */
    @Override
    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

}

位于处理器链末端的是一个Handler,DispactherServlet通过HandlerAdapter适配器对Handler进行封装,并按统一的适配器接口对Handler处理方法进行调用。

<!-- 配置MVC拦截器 -->
<mvc:interceptors>
    <!-- 使用bean定义一个interceptor,直接定义在mvc:interceptors根下面interceptor
        将拦截所有的请求
     -->
     <bean class="com.springmvc.assess.interceptor.TimeInterceptor" />
    <mvc:interceptor>
        <!-- 定义在mvc:interceptor下面的表示对特定的请求才进行拦截 -->
        <mvc:mapping path="/**" />
        <bean class="com.springmvc.assess.interceptor.SpringMvcInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

可以在SpringMVC.xml中配置多个拦截器,每个拦截器都可以指定一个匹配的映射路径,以限制拦截器的作用范围。

  • 拦截器例子
<!-- springmvc.xml配置MVC拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <bean class="com.springmvc.assess.interceptor.TimeInterceptor1" />
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <bean class="com.springmvc.assess.interceptor.TimeInterceptor2" />
    </mvc:interceptor>
</mvc:interceptors>

自定义拦截器
public class TimeInterceptor1 extends HandlerInterceptorAdapter {

    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("[TimeInterceptor1_preHandle]"+ "执行开始时间" + sf.format(new Date()));
        return true;

    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("[TimeInterceptor1_postHandle]"+ "执行时间");
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("[TimeInterceptor1_afterCompletion]"+ "执行结束时间" + sf.format(new Date()));
    }

}

public class TimeInterceptor2 extends HandlerInterceptorAdapter {

    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("[TimeInterceptor1_preHandle]"+ "执行开始时间" + sf.format(new Date()));
        return true;

    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("[TimeInterceptor1_postHandle]"+ "执行时间");
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("[TimeInterceptor1_afterCompletion]"+ "执行结束时间" + sf.format(new Date()));
    }

}

拦截器1放行,拦截器2放行,实现的效果:
这里写图片描述

将拦截器1放行,拦截器2阻止,实现的效果:
这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值