您遇到的问题是,
ExceptionTranslationFilter哪个将异常转换为错误页面,而
SecurityContextPersistenceFilter后者将身份验证从中提取出来
SecurityContextRepository并将其放入中
SecurityContextHolder。请求完成后,
SecurityContextPersistenceFilter会将信息从中取出
SecurityContextHolder。
清除的原因
SecurityContextHolder是,
SecurityContextHolder通常是本地线程,如果servlet容器要重用线程(大多数这样做),它们可能会不小心将这些凭据提供给其他人。
通常,
ExceptionTranslationFilter过滤器是最外面的过滤器,以避免发生任何异常无法转换的风险。
最好的选择是编写一个
ExceptionTranslationFilter接受
SecurityContextRepository(通常是您提到的HTTP会话)并
Authentication通过
SecurityContextRepository和而不是通过提供访问的自定义
SecurityContextHolder。请记住,
Authentication如果用户未登录,则仍然为null。



