Я разработал одностраничное веб-приложение с использованием Spring Boot и Spring MVC. Я использую Spring Security и JWT для аутентификации пользователей. Я написал собственный AuthenticationFailureHandler, который работает, но я хочу знать, как я могу контролировать URL-адрес, на который пользователь перенаправляется при возникновении исключения. Мой AuthenticationFailureHandler выглядит так:
public class JwtAuthenticationFailureHandler implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
response.sendError(HttpStatus.UNAUTHORIZED.value(), exception.getMessage());
}
}
Когда JWT истекает, приложение генерирует AccountExpiredException, метод AuthenticationFailureHandler.onAuthenticationFailure выполняется и пользователь перенаправляется на страницу входа:
http://localhost:8080/login?sessionExpired=true
Это все хорошо, но я понятия не имею, как генерируется строка запроса sessionExpired = true, и я хочу иметь некоторый контроль над ней. В прошлом я использовал ExceptionMappingAuthenticationFailureHandlers, например:
Map<String, String> mappings = new HashMap<>();
mappings.put(BadCredentialsException.class.getCanonicalName(), BAD_CREDENTIALS_EXCEPTION_URL);
mappings.put(AccountExpiredException.class.getCanonicalName(), ACCOUNT_EXPIRED_EXCEPTION_URL);
mappings.put(CredentialsExpiredException.class.getCanonicalName(), CREDENTIALS_EXPIRED_EXCEPTION_URL);
mappings.put(DisabledException.class.getCanonicalName(), ACCOUNT_INACTIVE_EXCEPTION_URL);
mappings.put(LockedException.class.getCanonicalName(), ACCOUNT_LOCKED_EXCEPTION_URL);
mappings.put(ValidationException.class.getCanonicalName(), VALIDATION_EXCEPTION_URL);
ExceptionMappingAuthenticationFailureHandler exceptionMappingAuthenticationFailureHandler = new ExceptionMappingAuthenticationFailureHandler();
exceptionMappingAuthenticationFailureHandler.setExceptionMappings(mappings);
Поэтому, основываясь на различных исключениях, приведенных выше, я хотел бы иметь возможность перенаправить на следующие URL-адреса:
http://localhost:8080/login?error
http://localhost:8080/login?accountexpired
http://localhost:8080/login?credentialsexpired
http://localhost:8080/login?accountlocked
http://localhost:8080/login?accountinactive
http://localhost:8080/login?validationerror
Я не уверен, кто должен делать это с response.sendError, и я не знаю, как генерируется строка запроса sessionExpired = true. Я пробовал бросать разные исключения, но URL никогда не меняется.
У меня есть пара вопросов. Можно ли управлять URL-адресом при использовании HttpServletResponse.sendError и, если нет, можно ли установить код HttpStatus при использовании ExceptionMappingAuthenticationFailureHandler.sendRedirect?