Как вернуть Джерси MVC Видимый после перенаправления аутентификации? - PullRequest
1 голос
/ 21 февраля 2020

TLDR: Мой метод требует 2 перенаправления / пересылки для работы (1 для аутентификации и 1 для обслуживания страницы jsp). Как я могу разрешить оба перенаправления / пересылки (или сделать это необязательным), чтобы не столкнуться с ошибкой, java .lang.IllegalStateException: Невозможно переслать после того, как ответ был зафиксирован.

Для получения дополнительной информации контекст:

У меня есть java сервлет с методом, который выглядит примерно так:

@GET
@Path("/test")
@Authenticate
public Viewable test(@Context HttpServletRequest request, @Context HttpServletResponse response) {
    Map<String, Object> model = createModel();
    return new Viewable("/somePath/jspFile", model);
}

Аннотация @Authenticate перехватывает вызов для выполнения некоторых Open ID Connect тип аутентификации, который приводит к тому, что пользователь перенаправляется на другой сервер для всех нужд аутентификации. Если пользователь прошел проверку подлинности, он перенаправляется обратно в мое приложение.

Однако при нажатии URL-адреса для этого метода я получаю java .lang.IllegalStateException: Невозможно переслать после получения ответа привержен . Я не слишком много знаю об использовании этого Viewable класса, но основываясь на том факте, что я не сталкиваюсь с этой ошибкой при возврате String / void / что-либо еще, я предполагаю, что возвращать новый Viewable необходимо выполнить переадресацию, в результате которой пользователь увидит страницу jsp.

Я прочитал основной пост ТАК об этой ошибке , но я не уверен, как применить исправления к моей текущая проблема. Например, я не знаю, как бы я применил что-то вроде следующего исправления:

protected void doPost() {
    if (someCondition) {
        sendRedirect();
    } else {
        forward();
    }
}

Исправление предполагает, что я могу либо перенаправить, либо переслать, но мой текущий метод нуждается в перенаправлении для аутентификации И переадресация / перенаправление на страницу jsp. Может быть, я упускаю очевидное исправление, которое не требует полного пересмотра текущего кода?

Редактировать: Было бы неплохо, если бы я мог проверить, был ли пользователь аутентифицирован первым, но я Предположим, что использование этой аннотации вообще автоматически влечет за собой первоначальное перенаправление

Редактировать: похоже, что пользователь перенаправлен для первоначальной аутентификации при входе в систему, но его не нужно перенаправлять снова после аутентификации один раз из-за SSO

1 Ответ

0 голосов
/ 21 февраля 2020

Хорошо, основываясь на предварительном тестировании, мне кажется, что сработало следующее решение:

  1. Проверьте, аутентифицирован ли пользователь уже
  2. Верните ответ, а не Доступно для просмотра.

Поскольку пользователя нужно перенаправить только в первый раз для аутентификации, я могу вернуть пустой / бессмысленный ответ в качестве заполнителя. И затем, как только пользователь прошел аутентификацию и вернулся в мое приложение, я могу вернуть Viewable, завернутый в объект Response.

Таким образом, код будет выглядеть примерно так:

@GET
@Path("/test")
@Authenticate
public Response test(@Context HttpServletRequest request, @Context HttpServletResponse 
response) {
    Map<String, Object> model = createModel();
    if (userIsAuthenticated()) {
        return Response.status(401).build();
    } else {
        return Response.ok(new Viewable("/somePath/jspFile", model)).build();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...