过滤器和拦截器的区别以及配置使用

本文详细介绍了Servlet中的Filter和Interceptor的区别与应用场景。Filter是对用户请求进行预处理和响应后处理,适用于全局处理,如登录验证、字符编码转换等。Interceptor则在AOP中用于方法访问前后的拦截,常用于权限校验、日志记录等。配置方面,Filter需实现Filter接口并在SpringBoot中注册,Interceptor需实现HandlerInterceptor接口并配置在WebMvcConfigurer。Filter与Interceptor在功能和使用上各有侧重,理解它们的不同对于优化Web应用至关重要。
Filter过滤器介绍:需要实现Filter接口

       Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。
       使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行预处理并生成响应,最后Filter再对服务器响应进行后处理。

Filter使用场景:

       在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
       根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
       在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
       根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

Filter配置:

在SpringBoot中的配置,自己编写类MyFilter实现Filter接口重写里边的方法,然后将该类导入FilterRegistrationBean类中:

import org.springframework.stereotype.Component;

import javax.servlet.*;
import java.io.IOException;
//自定义拦截器实现Filter接口
@Component
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化:容器一启动就会调用
        System.out.println("MyFilter...init......");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //在DispatcherServlet之前执行
        System.out.println("MyFilter...doFilter......");
        //决定是否放行,如果不设置,不会放行
        filterChain.doFilter(servletRequest,servletResponse);
        //在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后
        System.out.println("MyFilter...doFilter之后......");
    }

    @Override
    public void destroy() {
        System.out.println("MyFilter...destroy......");
    }
}
import com.yc.filter.MyFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration   //当前配置类
 public class MyWebConfig {
     @Autowired    //将自定义的过滤器注入进来
     private MyFilter myFilter;

     //设置拦截器
     @Bean
     public FilterRegistrationBean initFilter(){
         FilterRegistrationBean registrationBean = new FilterRegistrationBean();
         registrationBean.setFilter(myFilter);
         registrationBean.setName("myFilter");
         registrationBean.addUrlPatterns("/*");   //对其路径进行拦截
         return registrationBean;
     }
 }
Interceptor拦截器介绍:需要实现Interceptor接口

       拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

Interceptor配置:
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//自动以拦截器
@Component
public class MyInterceptor implements HandlerInterceptor {
    /**
     * 在controller之前执行
     * */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor....preHandle....");
        return true;
    }

    /**
     * 在controller执行之后的DispatcherServlet之后执行
     * */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor....postHandle....");
    }

    /**
     * 在页面渲染完成返回给客户端之前执行
     * */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("MyInterceptor....afterCompletion....");
    }
}

将拦截器配置在SpringBoot中,这点与Filter的配置有所不同,Interceptor需要配置类实现WebMvcConfigurer接口,然后进行配置。如下所示:

import com.yc.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
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 MyWebMVCConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry){
        //添加我们的拦截器配置
        //拦截所有请求
        registry.addInterceptor(myInterceptor).addPathPatterns("/**");
    }
}

过滤器和拦截器的区别:
过滤器可以修改request,而拦截器不能。
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法。
过滤器可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。
拦截器可以拿到你请求的控制器和方法,却拿不到请求方法的参数。
Filter是基于函数回调的,而Interceptor则是基于Java反射的。
Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值