最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot注冊FilterRegistrationBean相關(guān)情況講解

 更新時(shí)間:2023年02月03日 10:36:17   作者:愿做無知一猿  
這篇文章主要介紹了SpringBoot注冊FilterRegistrationBean相關(guān)情況,借助FilterRegistrationBean來注冊filter,可以避免在web.xml種配置filter這種原始的寫法

思路

  • 首先編寫程序時(shí),或多或少會(huì)存在幾個(gè)固定的Filter,那么第一步就是為確定的那幾個(gè)Filter指定好順序。(通常情況下的使用場景是:你要將你現(xiàn)在編寫的項(xiàng)目打包成jar給別的項(xiàng)目使用)
  • 其次程序確定的幾個(gè)Filter已經(jīng)編寫好了,那么需要將它們和不確定的那幾個(gè)放在一起進(jìn)行重新排序。
  • 將排好序的Filter進(jìn)行注冊。

補(bǔ)充:FilterRegistrationBean的使用

@Bean
FilterRegistrationBean<AFilter> filterRegistrationBean() {
    FilterRegistrationBean<AFilter> filterRegistrationBean = new FilterRegistrationBean<>();
    filterRegistrationBean.setFilter(new AFilter());
    return filterRegistrationBean;
}

手動(dòng)注冊代碼

先隨便定義幾個(gè)過濾器,后面?zhèn)溆?/p>

都一樣的,我復(fù)制了幾個(gè):AFilter、BFilter、CFilter、DFilter、EFilter

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
public class AFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("A 的過濾器");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        Map<String, String[]> parameterMap = request.getParameterMap();
        for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
            System.err.println("AAAA----->>>>>>  " + entry.getKey() + "----" + Arrays.toString(entry.getValue()));
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

調(diào)試用的controller

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
    @RequestMapping("/test")
    public Object test() {
        return "123";
    }
}

已確定的過濾器注冊類

import javax.servlet.Filter;
import java.util.HashMap;
import java.util.Map;
/**
 * 已確定的過濾器排序
 */
public class InitFilterOrderRegistration {
    private static final int INITIAL_ORDER = 200;
    private static final int ORDER_STEP = 100;
    private final Map<String, Integer> filterToOrder = new HashMap<>();
    InitFilterOrderRegistration() {
        Step order = new Step(INITIAL_ORDER, ORDER_STEP);
        put(AFilter.class, order.next());
        put(BFilter.class, order.next());
        put(CFilter.class, order.next());
    }
    public Map<String, Integer> getOrderedFilterMap() {
        return this.filterToOrder;
    }
    void put(Class<? extends Filter> filter, int position) {
        String className = filter.getName();
        if (this.filterToOrder.containsKey(className)) {
            return;
        }
        this.filterToOrder.put(className, position);
    }
    Integer getOrder(Class<?> clazz) {
        while (clazz != null) {
            Integer result = this.filterToOrder.get(clazz.getName());
            if (result != null) {
                return result;
            }
            clazz = clazz.getSuperclass();
        }
        return null;
    }
    private static class Step {
        private int value;
        private final int stepSize;
        Step(int initialValue, int stepSize) {
            this.value = initialValue;
            this.stepSize = stepSize;
        }
        int next() {
            int value = this.value;
            this.value += this.stepSize;
            return value;
        }
    }
}

手動(dòng)注冊Filter的類

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.*;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.core.OrderComparator;
import org.springframework.core.Ordered;
import org.springframework.util.CollectionUtils;
import javax.servlet.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class DefaultFilterRegister implements BeanDefinitionRegistryPostProcessor {
    private final List<OrderedFilter> filters = new ArrayList<>();
    private final InitFilterOrderRegistration filterOrders = new InitFilterOrderRegistration();
    private final List<Filter> toRegister = new ArrayList<>();
    public DefaultFilterRegister performRegister() {
        Map<String, Integer> orderedFilterMap = filterOrders.getOrderedFilterMap();
        for (Map.Entry<String, Integer> entry : orderedFilterMap.entrySet()) {
            try {
                OrderedFilter orderedFilter = new OrderedFilter((Filter) Class.forName(entry.getKey()).newInstance(),
                        entry.getValue());
                this.filters.add(orderedFilter);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //排序并構(gòu)造
        this.filters.sort(OrderComparator.INSTANCE);
        for (OrderedFilter filter : this.filters) {
            toRegister.add(filter.filter);
        }
        return this;
    }
    public DefaultFilterRegister addFilterAfter(Filter filter, Class<? extends Filter> afterFilter) {
        return addFilterAtOffsetOf(filter, 1, afterFilter);
    }
    public DefaultFilterRegister addFilterBefore(Filter filter, Class<? extends Filter> beforeFilter) {
        return addFilterAtOffsetOf(filter, -1, beforeFilter);
    }
    private DefaultFilterRegister addFilterAtOffsetOf(Filter filter, int offset,
                                                      Class<? extends Filter> registeredFilter) {
        int order = this.filterOrders.getOrder(registeredFilter) + offset;
        this.filters.add(new OrderedFilter(filter, order));
        return this;
    }
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        if (CollectionUtils.isEmpty(toRegister)) {
            return;
        }
        for (Filter filter : toRegister) {
            BeanDefinitionBuilder beanDefinitionBuilder =
                    BeanDefinitionBuilder.genericBeanDefinition(filter.getClass());
            AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
            beanDefinition.setBeanClass(filter.getClass());
            beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
            registry.registerBeanDefinition(filter.getClass().getName(), beanDefinition);
        }
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory bf) throws BeansException {
        //可以通過這個(gè)BeanFactoryPostProcessor接口實(shí)現(xiàn)使某些過濾器失效的操作
        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) bf;
        Arrays.stream(beanFactory.getBeanNamesForType(javax.servlet.Filter.class))
                .forEach(name -> {
                    //例如讓A失效
                    if (name.equals(AFilter.class.getTypeName())) {
                        BeanDefinition definition = BeanDefinitionBuilder
                                .genericBeanDefinition(FilterRegistrationBean.class)
                                .setScope(BeanDefinition.SCOPE_SINGLETON)
                                .addConstructorArgReference(name)
                                .addConstructorArgValue(new ServletRegistrationBean[]{})
                                .addPropertyValue("enabled", false)
                                .getBeanDefinition();
                        beanFactory.registerBeanDefinition(name + "FilterRegistrationBean",
                                definition);
                    }
                });
    }
    private static final class OrderedFilter implements Ordered, Filter {
        private final Filter filter;
        private final int order;
        private OrderedFilter(Filter filter, int order) {
            this.filter = filter;
            this.order = order;
        }
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
                throws IOException, ServletException {
            this.filter.doFilter(servletRequest, servletResponse, filterChain);
        }
        @Override
        public int getOrder() {
            return this.order;
        }
        @Override
        public String toString() {
            return "OrderedFilter{" + "filter=" + this.filter + ", order=" + this.order + '}';
        }
    }
}

注意代碼里的 postProcessBeanFactory 方法,我在里面使 A 過濾器失效。這應(yīng)該是通用的,如果有其他的過濾器想失效的,一樣操作即可。例如Spring Security中的一堆過濾器

將DefaultFilterRegister注冊成Bean

import com.kusch.filter.AFilter;
import com.kusch.filter.CFilter;
import com.kusch.filter.DefaultFilterRegister;
import com.kusch.filter.custom.DFilter;
import com.kusch.filter.custom.EFilter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class OrderedConfiguration {
    @Bean
    @ConditionalOnMissingBean
    DefaultFilterRegister defaultFilterRegister() {
        //正常的話應(yīng)該是:  A(被失效)   E   B   D   C
        DefaultFilterRegister defaultFilterRegister
                = new DefaultFilterRegister()
                .addFilterBefore(new DFilter(), CFilter.class)
                .addFilterAfter(new EFilter(), AFilter.class);
        return defaultFilterRegister.performRegister();
    }
}

以上便是手動(dòng)注冊Filter的全部代碼,同時(shí),如果該項(xiàng)目被打成jar包給其他項(xiàng)目使用時(shí),自定義DefaultFilterRegister這個(gè)Bean就可以實(shí)現(xiàn)在內(nèi)置的過濾器前面或者后面增加新的過濾器。

到此這篇關(guān)于SpringBoot注冊FilterRegistrationBean相關(guān)情況講解的文章就介紹到這了,更多相關(guān)SpringBoot注冊FilterRegistrationBean內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java阻塞隊(duì)列(BlockingQueue)的實(shí)現(xiàn)原理

    詳解Java阻塞隊(duì)列(BlockingQueue)的實(shí)現(xiàn)原理

    這篇文章主要介紹了詳解Java阻塞隊(duì)列(BlockingQueue)的實(shí)現(xiàn)原理,阻塞隊(duì)列是Java util.concurrent包下重要的數(shù)據(jù)結(jié)構(gòu),有興趣的可以了解一下
    2017-06-06
  • 簡述Java List去重五種方法

    簡述Java List去重五種方法

    這篇文章主要介紹了簡述Java List去重五種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 關(guān)于elcipse 安裝lombok插件解決 @Slf4j 等找不到log變量問題

    關(guān)于elcipse 安裝lombok插件解決 @Slf4j 等找不到log變量問題

    這篇文章主要介紹了關(guān)于elcipse 安裝lombok插件解決 @Slf4j 等找不到log變量問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Java實(shí)現(xiàn)圖片上文字內(nèi)容的動(dòng)態(tài)修改的操作步驟

    Java實(shí)現(xiàn)圖片上文字內(nèi)容的動(dòng)態(tài)修改的操作步驟

    在數(shù)字圖像處理領(lǐng)域,Java提供了強(qiáng)大的庫來處理圖片,包括讀取、修改和寫入圖片,如果你需要在Java應(yīng)用程序中修改圖片上的文字內(nèi)容,可以通過圖像處理技術(shù)來實(shí)現(xiàn),這篇博文將介紹如何使用Java實(shí)現(xiàn)圖片上文字內(nèi)容的動(dòng)態(tài)修改,需要的朋友可以參考下
    2024-07-07
  • mybatisplus如何實(shí)現(xiàn)排序

    mybatisplus如何實(shí)現(xiàn)排序

    這篇文章主要介紹了mybatisplus如何實(shí)現(xiàn)排序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 詳解Java從工廠方法模式到 IOC/DI思想

    詳解Java從工廠方法模式到 IOC/DI思想

    工廠方法(Factory Method)模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口。本文將詳細(xì)介紹Java從工廠方法模式到 IOC/DI思想。
    2021-06-06
  • Springboot如何實(shí)現(xiàn)自定義異常數(shù)據(jù)

    Springboot如何實(shí)現(xiàn)自定義異常數(shù)據(jù)

    這篇文章主要介紹了Springboot如何實(shí)現(xiàn)自定義異常數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java反射機(jī)制實(shí)例代碼分享

    Java反射機(jī)制實(shí)例代碼分享

    這篇文章主要介紹了Java反射機(jī)制實(shí)例代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • java實(shí)現(xiàn)順時(shí)針打印矩陣

    java實(shí)現(xiàn)順時(shí)針打印矩陣

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)順時(shí)針打印矩陣的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • spring?boot常見get?、post請(qǐng)求參數(shù)處理、參數(shù)注解校驗(yàn)、參數(shù)自定義注解校驗(yàn)問題解析

    spring?boot常見get?、post請(qǐng)求參數(shù)處理、參數(shù)注解校驗(yàn)、參數(shù)自定義注解校驗(yàn)問題解析

    這篇文章主要介紹了spring?boot常見get?、post請(qǐng)求參數(shù)處理、參數(shù)注解校驗(yàn)、參數(shù)自定義注解校驗(yàn),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

慈利县| 盐津县| 梁河县| 万全县| 铜鼓县| 杭州市| 连州市| 衡水市| 高淳县| 海门市| 清丰县| 金川县| 和顺县| 镇远县| 临桂县| 碌曲县| 海城市| 南涧| 宜兴市| 柳河县| 济宁市| 清新县| 河北省| 河源市| 安塞县| 崇阳县| 芜湖市| 乾安县| 永登县| 黑龙江省| 神木县| 增城市| 长乐市| 辛集市| 江西省| 三都| 盐亭县| 鸡东县| 岑溪市| 台安县| 怀宁县|