Spring MVC拦截器

bean-cfg.xml文件自定义自己的拦截器

    <mvc:interceptors>
        <!--配置自定义的拦截器-->
        <bean class="com.study.interceptors.firstInterceptor"/>
    </mvc:interceptors>

com.study.interceptors.firstInterceptor.java文件

package com.study.interceptors;

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

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

public class firstInterceptor implements HandlerInterceptor {
    /**
     * 在目标方法之前调用。
     * 若返回值为true,则继续调用后续的拦截器和目标方法
     * 若返回false,则不会再调用后续的拦截器和目标方法
     * 该方法可以考虑做权限验证,日志,事务等
     *
     * @param request  请求
     * @param response 响应
     * @param handler  视图名称或视图对象或属性
     * @return {boolean}
     * @throws Exception {String}
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("[FirstInterceptor]=>preHandle");
        return true;
    }

    /**
     * 调用目标方法之后,但渲染视图之前被调用
     * 该方法可以对请求域中的属性或视图做修改
     *
     * @param request      请求
     * @param response     响应
     * @param handler      自定义对象
     * @param modelAndView 含视图名称或视图对象或属性
     * @throws Exception {String}
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("[FirstInterceptor]=>postHandle");
    }

    /**
     * 渲染视图之后被调用,释放资源
     *
     * @param request  请求
     * @param response 响应
     * @param handler  自定义对象
     * @param ex       {string}
     * @throws Exception {string}
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("[FirstInterceptor]=>afterCompletion");
    }
}

拦截器执行流程

preHandle → handle → postHandle → 视图(DispatcherServlet) → afterCompletion

配置指定域拦截器

<!--配置LocalChanceInterceptor拦截器-->
    <mvc:interceptors>
        <!--配置指定域拦截器-->
        <mvc:interceptor>
            <mvc:mapping path="/path/"/>
            <bean class="com.study.interceptors.firstInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

配置多个拦截器

<!--配置LocalChanceInterceptor拦截器-->
    <mvc:interceptors>
        <bean class="com.study.interceptors.FirstInterceptor"/>
        <!--配置指定域拦截器-->
        <mvc:interceptor>
            <mvc:mapping path="/path/"/>
            <bean class="com.study.interceptors.LastInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

拦截器执行流程

[FirstInterceptor]:preHandle → [LastInterceptor]:preHandle → HandlerAdapter:handle → [LastInterceptor]:postHadnle → [FirstInterceptor]:postHadnle → DispatcherServlet:render → [LastInterceptor]:afterCompletion → [FirstInterceptor]:afterCompletion
posted @ 2020-11-06 10:23  MineLSG  阅读(79)  评论(0编辑  收藏  举报