springboot下Interceptor与Filter

FilterInterceptor

FilterInterceptor区别

  • 使用范围不同

    1. Filter是Servlet规范规定的,只能用于Web程序中。而Interceptor既可以用于Web程序,也可以用于application、Swing程序等
  • 规范不同

    1. Filter是在Servlet规范定义中的,是Servlet容器支持的。而Interceptor是在Spring容器内的,是Spring框架支持的
  • 使用资源不同

    1. Interceptor是Spring的组件,归Spring管理,配置在Spring文件中,因此可以使用Spring里的任何资源、对象,通过Ioc注入到Interceptor中即可,而Filter不可以
  • 深度不同

    1. Filter只在Servlet前后起作用,而Interceptor能够深入到方法前后、异常抛出前后等,因此Interceptor的使用具有更大的弹性。所以在Spring架构的程序中,要优先使用Interceptor
  • 其他

    1. Filter的实现基于回调函数。而Interceptor(代理模式)的实现基于反射,动态代理是Interceptor的简单实现。
    2. FilterInterceptor触发时机不一样,Filter是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前
    3. Filter可以修改request,而Interceptor不能
    4. 在action的生命周期中,Interceptor可以多次被调用,而Filter只能在容器初始化时被调用一次。

FilterInterceptor运行先后步骤

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wqfKsoKL-1575887230346)(image/20180418181054330.png)]

Filter的使用

配置有两种方式

1.Servlet自带的注解 @WebFilter

先创建过滤器实现类

@WebFilter(urlPatterns = "/*", filterName = "RestWebFilter")
public class RestWebFilter implements Filter {
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  }

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    filterChain.doFilter(servletRequest, servletResponse);
  }
  @Override
  public void destroy() {
  }
}

然后在Springboot main方法添加 @ServletComponentScan 开启扫描Servlet注解

@ServletComponentScan({
        "com.example.*.web"
})
2.基于Springboot配置

使用 @Configuration 配置类创建Bean

@Configuration
public class TestConfig {
    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new RestWebFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }
}

编写过滤器类实现Filter

public class RestWebFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    }
    @Override
    public void destroy() {
    }
}

Interceptor的使用

编写拦截器

继承 WebMvcConfigurerAdapter

springboot2.0之后被废弃

public class InterceptorConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogCostInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}
通过实现HandlerInterceptor
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("我的拦截器");
        return true;
    }

    @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 {
    }
}

注册拦截器方式

创建config配置类
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LogInterceptor()).addPathPatterns("/*");
  }
}
或springmvc.xml文件中配置
    <mvc:interceptors>
          <mvc:interceptor>
              <mvc:mapping path="/**"/>
 	            <bean class="com.example.common.web.TestInceptor"/>
	        </mvc:interceptor>
    </mvc:interceptors>

部分摘自:https://blog.csdn.net/heweimingming/article/details/79993591

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值