更新时间:2021-12-09 12:28:42 来源:极悦 浏览1580次
在本教程中,我们将了解如何使用 SpringMVC 创建 Web 过滤器。
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之前运行。
当我们使用 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 模式之外,我们还设置了过滤器的调度程序类型和顺序。
使用 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 将在过滤器链中处于活动状态。
在本教程中,我们研究了如何使用 Spring MVC 创建 Web 过滤器。如果大家想了解更相关知识,可以关注一下极悦的Java极悦在线学习,里面还有更丰富的知识等着大家去学习,希望对大家能够有所帮助。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习