SpringBoot过滤器使用|拦截器使用

本文介绍SpringBoot中过滤器的两种配置方式:注解和构建FilterRegistrationBean。不同于传统XML配置,SpringBoot倾向于使用Java代码配置,通过@Configuration和@Bean注解实现。文章详细解释了这些注解的作用及如何使用它们来配置过滤器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot使用过滤器的方式和传统xml配置方式不一样,传统方式是写一个继承Filter的自定义Filter,然后在web.xml中配置映射和类型信息,这样容器就能自动构建过滤流程了。SpringBoot没有使用xml配置的方式,过滤器的使用提供了两种方式,一种是注解,一种是构建FilterRegistrationBean方式。SpringBoot在配置上倾向于使用Java代码代替xml配置,所以很多配置只需要构建出相应的Bean即可完成配置,通常搭配只用的是@Configuration和@Bean注解,所以我们有必要了解这两个注解的作用:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {

	String value() default "";

}

可以看出@Configuration具备@Component的作用,所以使用包扫描的时候注意,另外@Configuration还有声明其是配置的作用,随后还会将其中被@Bean修饰的方法的返回值加入到IOC中,所以这两个注解往往是一起出现使用的。下面就是用Java方式配置Filter的实例:

@Configuration
public class FilterBeanConfig {

    /**
     * 
     * @return
     */
    @Bean
    public FilterRegistrationBean logFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new LogFilter());
        List<String> urlList = new ArrayList<String>();
        urlList.add("*");
        filterRegistrationBean.setUrlPatterns(urlList);
        return filterRegistrationBean;
    }
}
public class LogFilter implements Filter {
    
    private Logger logger = LoggerFactory.getLogger(LogFilter.class);
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        logger.info("Request--coming");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

有一点还需要说明,过滤器和拦截器的调用时机,过滤器的调用时机很早,Web容器如Tomcat在接收到了request后,就会由Filter来处理,随后是相应的Servlet处理,接着才是Interceptor处理,最后交给Controller处理,这当中其实还有一个过程,就是错误的处理,Servlet在处理的时候就能发现请求的合法性,所以这一步会有错误处理,并不是所有的请求都能到Interceptor这里,这个时候就依赖框架的错误处理机制了,如springboot在发现不合法请求时就会转发到/error这个地址,而且处理/error的流程就没走Filter这一层,可以通过打印相关日志证实,另外需要说明的一点是,这里的Servlet已经不是做业务逻辑处理的,很早以前Servlet编程流行的时候是,现在的Servlet多是派发器或是控制器之类的功能了。所以可以看出Interceptor和Controller通常会一起处理request,内部转发请求时不会经过Filter。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值