我们在项目中,有时候需要监听一下从发出请求到后台处理渲染页面完成这一时间段内的生命周期,并根据实际业务加以限制,比如比较常用的就是拦截所以验证是否登录。
那么springmvc给我们提供了添加自定义生命周期拦截器的配置,那就是addInterceptors,那么我们就来学习一下他的使用吧。

1、创建配置类,并且通过注解@Bean的方式返回WebMvcConfigurer加入到spring容器里面

package com.osy.config;

import com.osy.annotation.AdminController;
import com.osy.annotation.AppController;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.util.UrlPathHelper;

@Configuration
public class WebMvcConfiguration {

    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
           
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
            // addInterceptor方法是注册一个生命周期拦截器,addPathPatterns方法是拦截的url地址,
            // excludePathPatterns是排除那些地址不拦截,order方法是拦截顺序,就是拦截器执行链的执行顺序,值越大,拦截就越靠后,这里注册两个是为了验证顺序的
                registry.addInterceptor(new ZyInterceptor()).addPathPatterns("/**").excludePathPatterns("/test").order(1);
                registry.addInterceptor(new OtherInterceptor()).addPathPatterns("/**").excludePathPatterns("/test").order(2);
            }

        };
    }

}
2、创建自定义生命周期拦截器实现HandlerInterceptor,

HandlerInterceptor是一个接口,他有三个默认方法**(java对接口的改进)**,
三个生命周期函数:controlloer请求执行之前,controlloer请求执行之后,渲染完成之前,
整个请求完成执行完之后,由于现在的接口可以不实现默认方法,所以我们需要哪个周期的函数,那么我们就实现哪个周期就可以了

package com.osy.config;

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

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

/**
 * 请求拦截
 */
public class ZyInterceptor implements HandlerInterceptor {

    /**
     * 在Controller请求执行之前,
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("zy");
        // 返回值表示是否向下执行,如果返回false,那么中止执行链。通常发送HTTP错误或编写自定义响应给请求端
        return true;
    }

    /**
     * Controller处理之后,渲染完成之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 整个请求完成执行完之后
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
package com.osy.config;

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

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

/**
 * 请求拦截
 */
public class OtherInterceptor implements HandlerInterceptor {

    /**
     * 在Controller请求执行之前,
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 返回值表示是否向下执行,如果返回false,那么中止执行链。通常发送HTTP错误或编写自定义响应给请求端
        System.out.println("other");
        return true;
    }

    /**
     * Controller处理之后,渲染完成之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 整个请求完成执行完之后
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

最后请求除了/test的地址,他都会经过这个拦截器:
控制台打印:(证明拦截到位,顺序也到位)
zy
other
zy
other

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐