一、OncePerRequestFilter
OncePerRequestFilter顧名思義,他能夠確保在一次請求只通過一次filter,而不需要重復(fù)執(zhí)行。
Springboot中javax.servlet.Filter原生接口的實現(xiàn);而Spring的OncePerRequestFilter類實際上是一個實現(xiàn)了Filter接口的抽象類。spring對Filter進行了一些封裝處理。 此方法是為了兼容不同的web container,也就是說并不是所有的container都入我們期望的只過濾一次,servlet版本不同,執(zhí)行過程也不同,因此,為了兼容各種不同運行環(huán)境和版本,默認filter繼承OncePerRequestFilter是一個比較穩(wěn)妥的選擇。
二、自定義過濾器
@Configuration
public class EncodeFilter extends OncePerRequestFilter {
private String encoding = "UTF-8";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
filterChain.doFilter(request, response);
}
}
OncePerRequestFilter,確保在一次請求中只通過一次filter。
優(yōu)先級比攔截器高。
三、Spring boot filter 配置多個時,執(zhí)行順序
在 spring boot 配置Filter過濾器 中簡單介紹了spring boot 中如何添加過濾器,有人問到如果配置多個怎么控制,先經(jīng)過哪個過濾器,后經(jīng)過哪個過濾器。在web.xml中,我們知道,執(zhí)行順序是誰在前邊執(zhí)行誰。
在spring boot中的FilterRegistrationBean注冊過濾器的類中有個order屬性,
private int order = Ordered.LOWEST_PRECEDENCE;
/**
* 配置過濾器
* @return
*/
@Bean
public FilterRegistrationBean someFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(sessionFilter());
registration.addUrlPatterns("/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("sessionFilter");
registration.setOrder(Integer.MAX_VALUE);
return registration;
}
再有一個過濾器的話,可以設(shè)置成 registration.setOrder(Integer.MAX_VALUE - 1)
spring boot也提供了注解的方式:
/**
* 配置過濾器
* @return
*/
@Bean
@Order(Integer.MAX_VALUE)
public FilterRegistrationBean someFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(sessionFilter());
registration.addUrlPatterns("/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("sessionFilter");
return registration;
}