SpringBoot编写过滤器和拦截器

拦截器和过滤器的区别
  • Filter是基于函数回调的,而Interceptor则是基于Java反射的。
  • Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
  • Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
  • Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
  • 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
执行顺序下面借用网上的一张图给大家解释

下面给大家列出来一些用处

Filter(过滤器) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。

拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。

切片 (Aspect) : 可以拿到方法的参数,但是却拿不到http请求和响应的对象

配置类
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class SzConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/*");
    }



    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }


}

过滤器

@Slf4j
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("初始化容器");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request= (HttpServletRequest) servletRequest;
        HttpServletResponse response= (HttpServletResponse) servletResponse;
        //封装log实体类
        Map<String, String[]> parameterMap = request.getParameterMap();
        System.out.println(CollectionUtils.isEmpty(parameterMap));
        log.info("请求来源: =》{}", request.getRemoteAddr());
        log.info("请求URI:{}", request.getRequestURI());
        log.info("请求方式:{}", request.getMethod());
        log.info("请求参数:{}", parameterMap.toString());
        log.info("=====================LogFilter前置  end=====================>");
        for (Map.Entry<String,String[]> entry:parameterMap.entrySet()){
            log.info("请求参数名称:{}", entry.getKey());
            log.info("请求参数值:{}", entry.getValue());
        }
        //消耗时间
        long start = System.currentTimeMillis();
        // 执行主体方法start==================================================================
        filterChain.doFilter(request, response);
        // 执行主体方法  end==================================================================
        //耗时
        long time = System.currentTimeMillis() - start;
        log.info("耗时(毫秒):{}", time);
    }
    @Override
    public void destroy() {
      log.info("容器销毁");
    }
}

拦截器

@Slf4j
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("【MyInterceptor】调用了:{}", request.getRequestURI());
        request.setAttribute("requestTime", System.currentTimeMillis());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("类名:{}",((HandlerMethod) handler).getBean().getClass().getName());
        log.info("方法名:{}",((HandlerMethod) handler).getMethod().getName());
        log.info("【MyInterceptor】执行了");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long duration = (System.currentTimeMillis() - (Long) request.getAttribute("requestTime"));
        log.info("【MyInterceptor】[{}]调用耗时:{}ms", request.getRequestURI(), duration);
    }
}

执行结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值