Cannot register after unregistered Filter

 

因为对springsecurity不熟悉,在配置过滤器的时候报出了如题所示的错误,对应的代码如下:

错就错在addFilterAfter那里,我不应该用AuthenticationFilter.class作为第二个参数。点进addFilterAfter查看内部源码:

public HttpSecurity addFilterAfter(Filter filter, Class<? extends Filter> afterFilter) {
    this.comparator.registerAfter(filter.getClass(), afterFilter);
    return this.addFilter(filter);
}

再看registerAfter的源码:

public void registerAfter(Class<? extends Filter> filter, Class<? extends Filter> afterFilter) {
    Integer position = this.getOrder(afterFilter);
    if (position == null) {
        throw new IllegalArgumentException("Cannot register after unregistered Filter " + afterFilter);
    } else {
        this.put(filter, position + 1);
    }
}

发现报错原因是由于position == null。再点getOrder进去看看:

private Integer getOrder(Class<?> clazz) {
    while(clazz != null) {
        Integer result = (Integer)this.filterToOrder.get(clazz.getName());
        if (result != null) {
            return result;
        }

        clazz = clazz.getSuperclass();
    }

    return null;
}

可以看到,filterToOrder是一个Map,其预先put了固定的若干个过滤器类,它会试图去查找XXXFilter.class,但是没有找到,所以为null。addFilterBefore的作用就是将我们自定义的过滤器根据XXXFilter.class所在filterToOrder中的位置,是插在它的前面还是它的后面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值