因为对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中的位置,是插在它的前面还是它的后面。