spring mvc常见的拦截器与过滤器

spring mvc常见的拦截器与过滤器

由于最近面试比较多,所以要临时抱佛脚巩固一下基础知识

在聊Filter和handler之前呢,我们要清楚spring mvc的请求流程

url -> preFilter -> preHandler -> DispatcherServlet -> requestMapping -> postHandler -> afterCompletion -> doFilter

大概是上面的流程,我们也可以用下面的图来表示

yejN6K.png

只要记住 Filter
最开始就要启动就行了

Filter

这里我只说一下spring mvc里面常见的Filter

  • GenericFilterBean

org.springframework.web.filter.GenericFilterBean.java

public abstract class GenericFilterBean implements
        Filter, BeanNameAware, EnvironmentAware, ServletContextAware, InitializingBean, DisposableBean {

    @Override
    public final void setBeanName(String beanName) {
        this.beanName = beanName;
    }
    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }
    @Override
    public final void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }
    @Override
    public void afterPropertiesSet() throws ServletException {
        initFilterBean();
    }
}
//......

这个类主要实现了spring生命周期的几个接口,方便作为bean纳入IOC容器管理。

  • OncePerRequestFilter
    spring 里面所有的Filter 都默认继承这个东西,意思是只用一次的Filter

handler

HandlerInterceptor

这个接口定义了三个方法,preHandle,postHandle,afterCompletion

  • preHandle
    这个里头返回false,则会停止继续往下执行
  • postHandle
    后处理回调方法,实现处理器的后处理,但在渲染视图之前执行,可以在这里额外往视图添加额外的变量等(在preHandle成功执行完,返回true的情况下执行)
  • afterCompletion
    在preHandle成功执行完,返回true的情况下执行.整个请求处理完毕回调方法,即在视图渲染完毕时回调

补充 spring boot过滤器FilterRegistrationBean

由于 Filter写的多了之后,我们要设置一下启动顺序,原来的Filter类实现了OncePreFilter接口之后加个@WebFilter就行了,现在不行了,这个东西不能设置启动顺序,所以需要这个我称之为过滤器的注册中心的东西注册一下

下面,贴出java常见的过滤器注册代码

@Configuration
public class DemoConfiguration {

    @Bean
    public FilterRegistrationBean<Test1Filter> RegistTest1(){
        //通过FilterRegistrationBean实例设置优先级可以生效
        //通过@WebFilter无效
        FilterRegistrationBean<Test1Filter> bean = new FilterRegistrationBean<Test1Filter>();
        bean.setFilter(new Test1Filter());//注册自定义过滤器
        bean.setName("flilter1");//过滤器名称
        bean.addUrlPatterns("/*");//过滤所有路径
        bean.setOrder(1);//优先级,最顶级
        return bean;
    }
}
原文地址:https://www.cnblogs.com/adroitwolf/p/14359820.html