1. ExceptionTranslationFilter
处理过滤器中抛出的任何AccessDeniedException
和AuthenticationException
. 它提供了Java异常和HTTP响应之间的桥梁。
-
调用
chain.doFilter(req, res)
来继续调用程序后续部分. -
如果用户未认证或接收到
AuthenticationException
. 那么开始进行身份认证. 此时会做以下工作:-
清除
SecurityContextHolder
-
将
HttpServletRequest
存储到RequestCache
. 当用户认证成功后,RequestCache
用来恢复原始请求. -
通过
AuthenticationEntryPoint
向客户端请求身份认证.
-
-
如果接收到的是
AccessDeniedException
, 首先判断当前用户是否是一个匿名用户,如果是, 则调用AuthenticationEntryPoint
. 否则则调用AccessDeniedHandler
(默认为AccessDeniedHandlerImpl
),访问将被拒绝.
如果接收到的不是以上两种异常, ExceptionTranslationFilter
将不会做任何处理. 其处理伪代码:
try {
filterChain.doFilter(request, response);
} catch (AccessDeniedException | AuthenticationException ex) {
if (!authenticated || ex instanceof AuthenticationException) {
startAuthentication();
} else {
accessDenied();
}
}
2. 使用注意
使用这个示filter, 必须配置以下属性:
- authenticationEntryPoint
- requestCache: 默认为
HttpSessionRequestCache
.
网友评论