SpringBoot--實戰(zhàn)開發(fā)--過濾器(三十六)

一、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;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容