#spring #spring-security
#spring #spring-безопасность
Вопрос:
Привет, у меня есть фильтр для получения авторизации из JWT
public class JwtAuthorizationFilter extends AbstractAuthenticationProcessingFilter {
public JwtAuthorizationFilter() {
super("/**");
}
@Override
public void setAuthenticationSuccessHandler(AuthenticationSuccessHandler successHandler) {
super.setAuthenticationSuccessHandler(successHandler);
}
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
super.successfulAuthentication(request, response, chain, authResult);
chain.doFilter(request, response);
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
String token = request.getHeader("Authorization");
//code
return getAuthenticationManager().authenticate(getAuthentication(token));
}
private UsernamePasswordAuthenticationToken getAuthentication(String token) {
// code
}
Проблема в том, что когда я достигаю успешной аутентификации и выполняю цепочку.После выполнения фильтра я получаю исключение «servlet.service() для сервлета [DispatcherServlet] в контексте с path [] выдало исключение [Ошибка обработки запроса; вложенным исключением является java.lang.Исключение IllegalStateException: не удается вызвать sendError() после того, как ответ был зафиксирован] по основной причине» И я не могу получить свою конечную точку. Я также замечаю, что authResult генерирует много (объектов?) с теми же данными, даже если я вхожу в систему только один раз
@Edit Теперь я заметил, что после успешной авторизации spring несколько раз пытается связаться с моим контроллером. Первое возвращаемое значение, но другие просто выдают исключения, и я не знаю, почему у меня есть этот цикл
Ответ №1:
Что делается внутри super.successfulAuthentication
? Если вы внесете какие-либо изменения в HttpServletResponse
объект, например, путем изменения кодов состояния Http или ResponseEntity
вы больше не сможете перейти к следующему фильтру в цепочке путем вызова chain.doFilter(request, response)
, поскольку ответ зафиксирован и возвращен клиенту.