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

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

<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) (непросто) ?

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

1 Ответ

5 голосов
/ 01 марта 2011

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

Итак:

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

или,больше JSF-иш:

String uri = externalContext.getRequestMap().get("javax.servlet.forward.request_uri");
...