Springboot 拦截器

巧了我就是萌 提交于 2020-01-25 09:25:16

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

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

拦截器:

过滤器:

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 @.@ @.@ @.@ @.@@.@@.@ @.@ @.@ @.@ @.@");
    }
}

向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("/**");
    }
}

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!