过滤器
过滤器的实现:
- javaWeb实现:实现javax.servlet.Filter接口:如果设置拦截方式为forward,默认重定向拦截
- Spring对Filter接口进行再次封装:OncePerRequestFilter 抽象类,Spring框架推荐使用
OncePerRequestFilter : 只对该请求执行一次过滤
过滤器的配置方式:
1、Javaweb的实现:
使用@WebFilter注解(javaWeb的注解),配置过滤器,使用@ServletComponentScan扫描web注解
当使用转发时,因为转发是一次请求,两次跳转,所以会被拦截两次
继承OncePreRequestFilter, 一次请求只拦截一次
2、使用Springboot提供的配置类方式配置: FilterRegistrationBean 类,专门用于注册过滤器
提供setOrder() 指定过滤器执行顺序, 数字越小,越先执行
配置类:
/**
* javaWeb的配置类
*/
//@Configuration
@SpringBootConfiguration
public class WebServletConfig {
//配置过滤器A
@Bean
public FilterRegistrationBean<AFilter> aFilterRegistrationBean(){
FilterRegistrationBean<AFilter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new AFilter());
//设置拦截的url
filterRegistrationBean.addUrlPatterns("/*");
//设置拦截方式
filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST,DispatcherType.FORWARD);
//设置执行顺序
filterRegistrationBean.setOrder(0);
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean<BFilter> bFilterRegistrationBean(){
FilterRegistrationBean<BFilter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new BFilter());
//设置拦截的url
filterRegistrationBean.addUrlPatterns("/*");
//设置拦截方式
filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST,DispatcherType.FORWARD);
//设置执行顺序
filterRegistrationBean.setOrder(-1);
return filterRegistrationBean;
}
}