ExceptionTranslationFilter过滤器位于倒数第4个,详细过滤器的次序参考
spring security中Filter的次序_kgduu的博客-CSDN博客
其会捕获其后三个过滤器的异常。

ExceptionTranslationFilter的处理逻辑为
- private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
- throws IOException, ServletException {
- try {
- chain.doFilter(request, response);
- }
- catch (IOException ex) {
- throw ex;
- }
- catch (Exception ex) {
- // Try to extract a SpringSecurityException from the stacktrace
- Throwable[] causeChain = this.throwableAnalyzer.determineCauseChain(ex);
- RuntimeException securityException = (AuthenticationException) this.throwableAnalyzer
- .getFirstThrowableOfType(AuthenticationException.class, causeChain);
- if (securityException == null) {
- securityException = (AccessDeniedException) this.throwableAnalyzer
- .getFirstThrowableOfType(AccessDeniedException.class, causeChain);
- }
- if (securityException == null) {
- rethrow(ex);
- }
- if (response.isCommitted()) {
- throw new ServletException("Unable to handle the Spring Security Exception "
- + "because the response is already committed.", ex);
- }
- handleSpringSecurityException(request, response, chain, securityException);
- }
- }
直接调用后序链中的过滤器。发起认证流程
- protected void sendStartAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
- AuthenticationException reason) throws ServletException, IOException {
- // SEC-112: Clear the SecurityContextHolder's Authentication, as the
- // existing Authentication is no longer considered valid
- SecurityContext context = this.securityContextHolderStrategy.createEmptyContext();
- this.securityContextHolderStrategy.setContext(context);
- this.requestCache.saveRequest(request, response);
- this.authenticationEntryPoint.commence(request, response, reason);
- }
调用AuthenticationEntryPoint的commence。