专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 创建SpringMVC过滤器

创建SpringMVC过滤器

更新时间:2021-12-09 12:28:42 来源:赢咖4 浏览1455次

1. 概述

在本教程中,我们将了解如何使用 SpringMVC 创建 Web 过滤器。

2. 使用 Spring Bean

Spring MVC 会将任何扩展HttpFilter 的bean 注册 为 web 过滤器。当我们以这种方式创建过滤器时,默认 URL 模式变为 /*。

@Slf4j
@Component
public class DateLoggingFilter extends HttpFilter {
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
      throws IOException, ServletException {
        log.info("New request at date: {}", new Date());
        chain.doFilter(request, response);
    }
}

在这里,我们将DateLoggingFilter声明 为 Spring bean。因此,Spring MVC 会将此 bean 注册为 Web 过滤器。

订购

通常,过滤器的顺序没有区别。但是如果一个过滤器的处理依赖于另一个过滤器,我们必须修改它们在过滤器链中的顺序。有两种方法可以实现这一点。

首先,我们可以使用@Order注释对过滤器进行排序:

@Component
@Order(Ordered.LOWEST_PRECEDENCE - 1)
public class DateLoggingFilter extends HttpFilter {
    // Implementation details...
}

在这里,我们有先前定义的 DateLoggingFilter,我们在@Order注释中将其顺序设置为 Ordered.LOWEST_PRECEDENCE - 1 。

或者,我们可以实现Ordered接口:

@Slf4j
@Component
public class TimeLoggingFilter extends HttpFilter implements Ordered {
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
      throws IOException, ServletException {
        log.info("New request at time: {}", new Time(System.currentTimeMillis()));
        chain.doFilter(request, response);
    }
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE - 99;
    }
}

在这里,TimeLoggingFilter的顺序为 Ordered.LOWEST_PRECEDENCE - 99。

现在我们有两个不同顺序的过滤器,我们将调查它们的调用顺序。

首先,Ordered.LOWEST_PRECEDENCE持有Integer.MAX_VALUE的值,而 Ordered.HIGHEST_PRECEDENCE是Integer.MIN_VALUE。因此,当订单号减少时,优先级会增加。

此外,具有更高优先级的过滤器将在过滤器链中运行得更早。

因此,TimeLoggingFilter 具有更高的优先级,并且会在DateLoggingFilter之前运行。

3. 使用 FilterRegistrationBean

当我们使用 Spring bean 创建 web 过滤器时,它会获取默认的 URL 模式,我们对其他注册属性没有太多控制。 FilterRegistrationBean 允许我们定义 Web 过滤器的不同注册属性。

@Configuration
public class FilterConfiguration {
    private final DateLoggingFilter dateLoggingFilter;
    @Autowired
    public FilterConfiguration(DateLoggingFilter dateLoggingFilter) {
        this.dateLoggingFilter = dateLoggingFilter;
    }
    @Bean
    public FilterRegistrationBean<DateLoggingFilter> dateLoggingFilterRegistration() {
        FilterRegistrationBean<DateLoggingFilter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(dateLoggingFilter);
        filterRegistrationBean.setUrlPatterns(Collections.singletonList("/*"));
        filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST);
        filterRegistrationBean.setOrder(Ordered.LOWEST_PRECEDENCE - 1);
        return filterRegistrationBean;
    }
}

在这里,我们使用DateLoggingFilter bean,但我们通过FilterRegistrationBean bean显式定义过滤器注册 。除了 URL 模式之外,我们还设置了过滤器的调度程序类型和顺序。

4. 使用@WebFilter 和@ServletComponentScan

使用 Servlet 3.0 规范,我们可以使用 @WebFilter注释等。Spring MVC 特别支持扫描用这些注释注释的类。

我们将首先使用@WebFilter创建一个过滤器:

@Slf4j
@WebFilter(urlPatterns = "/*", dispatcherTypes = {DispatcherType.REQUEST})
public class MethodLoggingFilter extends HttpFilter {
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
      throws IOException, ServletException {
        log.info("New request with {}", request.getMethod());
        chain.doFilter(request, response);
    }
}

请注意,我们在注释中指定了 URL 模式和调度程序类型。

创建过滤器后,我们将使用@ServletComponentScan使 Spring 扫描这些类:

@Configuration
@ServletComponentScan
public class FilterConfiguration {
    // Bean definitions 
}

当 Web 应用程序启动时,我们的MethodLoggingFilter 将在过滤器链中处于活动状态。

5. 总结

在本教程中,我们研究了如何使用 Spring MVC 创建 Web 过滤器。如果大家想了解更相关知识,可以关注一下赢咖4的Java赢咖4在线学习,里面还有更丰富的知识等着大家去学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>