Перенаправить на защищенный ресурс или исходный/сохраненный запрос после аутентификации Servlet 3.0 HttpServletRequest#login()?

Как и ожидалось, страница входа загружается при запросе защищенного/безопасного ресурса:

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>jdbc</realm-name>
    <form-login-config>
        <form-login-page>/login.xhtml</form-login-page>
        <form-error-page>/login.xhtml</form-error-page>
    </form-login-config>
</login-config>

Я понимаю, что j_security_check автоматически перенаправляется на защищенный/защищенный ресурс, если аутентификация прошла успешно:

<form method="post" action="j_security_check">
    <input type="text" name="j_username">
    <input type="password" name= "j_password">
</form>

Тем не менее, я хотел бы разрешить пользователям зарегистрироваться (или войти в систему), чтобы продолжить, поэтому я использовал JSF 2.0: <h:form..., EL: #{loginBean.register()}... и т. д., и я программно аутентифицируюсь с помощью Servlet 3.0:

public void register() {
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

    try {
        // Register...

        request.login(this.username, this.password);

        // Redirect to the protected/secure resource...

    } catch (ServletException e) {
        ...
    }
}

Как узнать, что это за изначально запрошенный ресурс? Возможно:

  • Получить «сохраненный запрос» из сеанса (для конкретного контейнера)?
  • Попробуйте как-нибудь получить доступ к "исходному запросу" (где)?
  • Что-нибудь, связанное с диспетчером запросов (смелая догадка)?
  • Использовать заголовок «referer» (плохая идея)?
  • Создать модуль проверки подлинности сервера (SAM) (не просто)?

Любой совет будет очень признателен!


person Grant Shield    schedule 28.02.2011    source источник


Ответы (1)


Страница входа находится под прикрытием, открытым форвардом, а исходный URI запроса доступен как атрибут запроса с именем javax.servlet.forward.request_uri.

So:

String uri = request.getAttribute("javax.servlet.forward.request_uri");

или, более JSF-ish:

String uri = externalContext.getRequestMap().get("javax.servlet.forward.request_uri");
person BalusC    schedule 01.03.2011
comment
Здравствуйте, в моем случае информация журнала отображается с перенаправлением. Я не знаю, как заставить его быть форвардным, поэтому работает request_ui. Будучи перенаправлением (я имею в виду, что в браузере отображается loginform.xhtml, а не исходная страница), я получаю пустое значение для request_ui. Есть идеи, как это решить? Спасибо. - person icordoba; 16.01.2015