欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Springboot 拦截器

程序员文章站 2022-07-09 17:14:37
...

拦截器和过滤器有点相似,但又有不同。

1.拦截器是属于框架Spring MVC ,过滤器是基于serlvet。

拦截器:

Springboot 拦截器

过滤器:

Springboot 拦截器

2.处理时机:

 过滤器执行在前,拦截器执行在后,拦截器是针对于controller。

3.实现方式不同:过滤器是基于函数回调,拦截器是基于代理模式。

 

Springboot实现拦截器如下:

实现interceptor接口,实现拦截器接口方法:

  1. preHandle:请求进入controller之前
  2. postHandle:请求离开controller之后
  3. afterCompletion:视图渲染完成后

我们的业务一般只需要实现 preHandle()这个方法就行:

package com.zxy.loglearn.config.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @USER: zhouxy
 * @DATE: 2019/12/26 14:32
 * 创建拦截器,需要实现 HandlerInterceptor 接口
 * 主要实现 preHandle ,必须要保证返回true , 才能保证继续执行下面的流程
 **/
@Slf4j
public class InterceptorConfig implements HandlerInterceptor {

    /**
     * 请求进入controller之前
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        log.info("enter interceptor $.$ $.$ $.$ $.$ $.$ $.$ $.$");
        return true;
    }

    /**
     * 请求离开controller
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, @Nullable ModelAndView modelAndView) throws Exception {

        log.info("wait interceptor -.- -.- -.- -.- -.- -.- -.- -.- -.- -.- -.-");
    }

    /**
     * 视图渲染完成后
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, @Nullable Exception ex) throws Exception {

        log.info("leave interceptor @aaa@qq.com @aaa@qq.com @aaa@qq.com @aaa@qq.com@aaa@qq.com@aaa@qq.com @aaa@qq.com @aaa@qq.com @aaa@qq.com @aaa@qq.com");
    }
}

向Spring Mvc注册拦截器:

package com.zxy.loglearn.config;

import com.zxy.loglearn.config.interceptor.InterceptorConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @USER: zhouxy
 * @DATE: 2019/12/26 17:40
 * 拦截器属于MVC框架,基于动态代理,aop的一种实现
 **/
@Configuration
public class InterceptorConfigure implements WebMvcConfigurer {

    /**
     * 添加拦截器 可以添加多个
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new InterceptorConfig()).addPathPatterns("/**");
    }
}

拦截器也跟过滤器一样,根据业务不同的需要添加多个拦截器。