成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Security的內置過濾器是如何維護的

開發 前端
Spring Security中的內置過濾器順序是怎么維護的?我想很多開發者都對這個問題感興趣。本篇我和大家一起探討下這個問題。

Spring Security中的內置過濾器順序是怎么維護的?我想很多開發者都對這個問題感興趣。本篇我和大家一起探討下這個問題。

HttpSecurity包含了一個成員變量FilterOrderRegistration,這個類是一個內置過濾器注冊表。至于這些過濾器的作用,不是本文介紹的重點,有興趣可以去看看FilterOrderRegistration的源碼。

內置過濾器的順序

FilterOrderRegistration維護了一個變量filterToOrder,它記錄了類之間的順序和上下之間的間隔步長。我們復制了一個FilterOrderRegistration來直觀感受一下過濾器的順序:

CopyFilterOrderRegistration filterOrderRegistration = new CopyFilterOrderRegistration();
// 獲取內置過濾器 此方法并未提供
Map<String, Integer> filterToOrder = filterOrderRegistration.getFilterToOrder();
TreeMap<Integer, String> orderToFilter = new TreeMap<>();
filterToOrder.forEach((name, order) -> orderToFilter.put(order,name));
orderToFilter.forEach((order,name) -> System.out.println(" 順序:" + order+" 類名:" + name ));

打印結果:

我們可以看得出內置過濾器之間的位置是相對固定的,除了第一個跟第二個步長為200外,其它步長為100。

內置過濾器并非一定會生效,僅僅是預置了它們的排位,需要通過HttpSecurity的addFilterXXXX系列方法顯式添加才行。

注冊過濾器的邏輯

FilterOrderRegistration提供了一個put方法:

 void put(Class<? extends Filter> filter, int position) {
String className = filter.getName();
// 如果這個類已經注冊就忽略
if (this.filterToOrder.containsKey(className)) {
return;
}
// 如果沒有注冊就注冊順序。
this.filterToOrder.put(className, position);
}

從這個方法我們可以得到幾個結論:

  • 內置的34個過濾器是有固定序號的,不可被改變。
  • 新加入的過濾器的類全限定名是不能和內置過濾器重復的。
  • 新加入的過濾器的順序是可以和內置過濾器的順序重復的。

獲取已注冊過濾器的順序值

FilterOrderRegistration還提供了一個getOrder方法:

  Integer getOrder(Class<?> clazz) {
// 如果類Class 或者 父類Class 名為空就返回null
while (clazz != null) {
Integer result = this.filterToOrder.get(clazz.getName());
// 如果獲取到順序值就返回
if (result != null) {
return result;
}
// 否則嘗試去獲取父類的順序值
clazz = clazz.getSuperclass();
}
return null;
}

HttpSecurity維護過濾器的方法

接下來我們分析一下HttpSecurity維護過濾器的幾個方法。

addFilterAtOffsetOf

addFilterAtOffsetOf是一個HttpSecurity的內置私有方法。Filter是想要注冊到DefaultSecurityFilterChain中的過濾器,offset是向右的偏移值,registeredFilter是已經注冊到FilterOrderRegistration的過濾器,而且registeredFilter沒有注冊的話會空指針。

 private HttpSecurity addFilterAtOffsetOf(Filter filter, int offset, Class<? extends Filter> registeredFilter) {
// 首先會根據registeredFilter的順序和偏移值來計算filter的
int order = this.filterOrders.getOrder(registeredFilter) + offset;
// filter添加到集合中待排序
this.filters.add(new OrderedFilter(filter, order));
// filter注冊到 FilterOrderRegistration
this.filterOrders.put(filter.getClass(), order);
return this;
}

務必記著registeredFilter一定是已注冊入FilterOrderRegistration的Filter。

addFilter系列方法

這里以addFilterAfter為例。

 @Override
public HttpSecurity addFilterAfter(Filter filter, Class<? extends Filter> afterFilter) {
return addFilterAtOffsetOf(filter, 1, afterFilter);
}

addFilterAfter是將filter的位置置于afterFilter后一位,假如afterFilter順序值為400,則filter順序值為401。addFilterBefore和addFilterAt邏輯和addFilterAfter僅僅是偏移值的區別,這里不再贅述。

addFilter的方法比較特殊:

 @Override
public HttpSecurity addFilter(Filter filter) {
Integer order = this.filterOrders.getOrder(filter.getClass());
if (order == null) {
throw new IllegalArgumentException("The Filter class " + filter.getClass().getName()
+ " does not have a registered order and cannot be added without a specified order. Consider using addFilterBefore or addFilterAfter instead.");
}
this.filters.add(new OrderedFilter(filter, order));
return this;
}

filter必須是已經注冊到FilterOrderRegistration的Filter,這意味著它可能是內置的Filter,也可能是先前通過addFilterBefore、addFilterAt或者addFilterAfter注冊的非內置Filter。

問題來了

之前看到一個問題,如果HttpSecurity注冊兩個重復序號的Filter會是怎么樣的順序呢?我們先來看下排序的機制:

// filters
private List<OrderedFilter> filters = new ArrayList<>();
//排序
this.filters.sort(OrderComparator.INSTANCE);

看了下OrderComparator源碼,其實還是通過數字的自然排序,數字越小越靠前。如果數字相同,索引越小越靠前。也就是同樣的序號,誰先add到filters誰就越靠前。


責任編輯:武曉燕 來源: 碼農小胖哥
相關推薦

2017-04-12 14:43:01

Spring ClouZuul過濾器

2022-02-14 07:32:13

Spring過濾器鏈Matcher

2021-01-14 08:13:39

Spring Clou應用內置過濾器

2024-01-05 09:04:35

隆過濾器數據結構哈希函數

2022-02-16 23:58:41

Spring過濾器驗證碼

2022-02-10 14:54:31

Spring容器過濾器

2009-06-18 10:13:00

Hibernate過濾

2023-01-26 01:41:27

核心全局過濾器

2009-07-08 17:33:37

Servlet過濾器

2021-07-05 15:22:03

Servlet過濾器客戶端

2016-12-07 09:56:13

JavaFilter過濾器

2024-11-04 08:45:48

布隆過濾器元數據指紋值

2017-05-04 22:30:17

Zuul過濾器微服務

2021-11-11 07:38:15

服務器過濾器框架

2009-07-08 15:30:56

Servlet過濾器

2009-07-14 09:09:08

Swing模型過濾器

2009-07-08 16:07:04

Servlet過濾器配

2009-09-29 13:55:23

Hibernate設置

2011-06-29 16:14:59

Qt 事件 過濾器

2009-07-03 18:26:11

Servlet過濾器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线一区二区三区 | 男女国产视频 | 91大神xh98xh系列全部 | 国产 日韩 欧美 制服 另类 | 国产精品久久久久久 | 中文精品久久 | 欧美一区二 | 日本一道本视频 | 日韩免费av | 午夜天堂精品久久久久 | 日韩中文一区二区三区 | 断背山在线观看 | 波多野结衣二区 | 亚洲成人99 | 日中文字幕在线 | 日韩精品视频在线观看一区二区三区 | 中文字幕精品一区 | 国产中文字幕在线观看 | 欧美成人一区二免费视频软件 | 国产真实乱对白精彩久久小说 | 亚洲社区在线 | 中文福利视频 | 日韩欧美网 | 狠狠躁躁夜夜躁波多野结依 | 国产精品一区二区精品 | 亚洲精品国产一区 | 伊人色综合久久天天五月婷 | 欧美中文字幕在线观看 | 欧美一二三 | 精品9999| 亚洲成人网在线观看 | 亚洲综合国产 | 精品久久久久久18免费网站 | 精品免费在线 | 91人人爽| 91精品国产一区二区三区 | 日韩在线中文字幕 | 欧美激情一区二区 | 国产精品一区二区久久精品爱微奶 | 成人自拍视频网站 | 国产成人精品一区二区三区在线观看 |