Spring Boot拦截器示例及源码原理分析

SpringMVC源码分析一文中,已经对SpringMVC的初始化及请求响应过程进行了分析,但未对拦截器进行深入研究。
本文将首先通过示例的方式了解拦截器的工作原理,然后再深入分析其源码来了解其内部原理。
本文代码基于Spring Boot+Kotlin。

1 自定义拦截器

GITHUB地址: https://github.com/icarusliu/learn

1.1 Interceptor定义

第一步我们先来定义一个Interceptor;
拦截器一般需要继承自HandlerInterceptor,并需要实现以下三个接口:

接口 接口名称 说明
preHandle 前置处理 在实际的Handle执行前执行;有Boolean类型的返回值,如果返回为False,则Handle本身及postHandle/afterCompletion以及后续的拦截器全部都不会再继续执行;为True则反之。
postHandle 后置处理 Handle执行后视图渲染前执行
afterCompletion 完成后处理 Handle执行且视图渲染完成后执行

Spring为方便使用实现了HandlerInterceptorAdapter的抽象类;需要实现的方法都实现为空的方法,在使用时只需实现必要的方法即可。

定义的测试拦截器见以下代码:

class TestInterceptor: HandlerInterceptorAdapter() {
    private val logger = LoggerFactory.getLogger(HandlerInterceptorAdapter::class.java)

    /**
     * This implementation always returns `true`.
     */
    @Throws(Exception::class)
    override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
        if (logger.isDebugEnabled) {
            logger.debug("TestInterceptor preHandle begin to execute!")
        }

        return true
    }

    /**
     * This implementation is empty.
     */
    @Throws(Exception::class)
    override fun postHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any,
                            @Nullable modelAndView: ModelAndView?) {
        if (logger.isDebugEnabled) {
            logger.debug("TestInterceptor postHandle begin to execute!")
        }
    }

    /**
     * This implementation is empty.
     */
    @Throws(Exception::class)
    override fun afterCompletion(request: HttpServletRequest, response: HttpServletResponse, handler: Any,
                                 @Nullable ex: Exception?) {
        if (logger.isDebugEnabled) {
            logger.debug("TestInterceptor afterCompletion begin to execute!")
        }
    }

    /**
     * This implementation is empty.
     */
    @Throws(Exception::class)
    override fun afterConcurrentHandlingStarted(request: HttpServletRequest, response: HttpServletResponse,
                                                handler: Any) {
        if (logger.isDebugEnabled) {
            logger.debug("TestInterceptor afterConcurrentHandlingStarted begin to execute!")
        }
    }
}

1.2 拦截器配置

拦截器定义完成后,还需要将拦截器引入,并指定该拦截器所拦截的场景。
在SpringBoot中,一般通过使用EnableWebMvc及Configuration两个注解,并实现WebMvcConfigurer接口来添加拦截器,实现代码如下:

@EnableWebMvc
@Configuration
class WebConfig: WebMvcConfigurer {
    override fun addInterceptors(registry: InterceptorRegistry) {
        registry.addInterceptor(TestInterceptor()).addPathPatterns("/**")
    }
}

注解一定要通过addPathPatterns来指定该拦截器所拦截的URL,如果不指定将不会拦截任何请求。.

1.3 定义Controller

Controller的定义比较简单,在此不细说,代码如下:

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot提供了拦截器Interceptor)的机制,可以在求进入控制器之前或之后进行一些自定义的处理。拦截器可以用于权限验证、日志记录、异常处理等。 要创建一个拦截器,首先需要实现`HandlerInterceptor`接口,并实现其的三个方法:`preHandle`、`postHandle`和`afterCompletion`。`preHandle`方法在求进入控制器之前被调用,`postHandle`方法在求处理完毕后但尚未返回前被调用,`afterCompletion`方法在求返回后被调用。 下面是一个简单的示例: ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在这里进行权限验证等操作 return true; // 返回true表示继续执行后续的拦截器和控制器,返回false表示求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在这里可以对返回结果进行一些处理 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在这里进行一些清理操作 } } ``` 然后,在Spring Boot应用的配置类注册该拦截器: ```java @Configuration public class AppConfig extends WebMvcConfigurerAdapter { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor); } } ``` 这样,拦截器就会生效了。你可以根据具体需求在拦截器的各个方法进行相应的处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值