Перенаправление сервлета Java с одного сервлета на другой, а затем обратно к исходному сервлету

#java #servlets #redirect #web

#java #сервлеты #перенаправление #веб

Вопрос:

У меня возник вопрос о сервлетах Java.

допустим, я нахожусь на веб-странице сервлета «somePage». Я хочу войти в систему (используя другой сервлет, сервлет «login»). Итак, я нажимаю на ссылку входа в систему на «somePage» и перенаправляюсь на страницу «login». Я ввожу свое имя и пароль, и они оба правильные. страница входа в систему успешно выполнила вход в систему.

(теперь спрашиваю о кодировании для сервлета «login») Как мне закодировать страницу входа в систему, чтобы она перенаправляла успешно вошедшего пользователя обратно на веб-страницу «somePage»?

Основной вопрос: как страница входа в систему узнает, что страница, которая изначально перенаправлялась на нее, является страницей ‘somePage’?

Я проверил множество параметров запроса, но не скажите мне, да, вы были перенаправлены со страницы «somePage». Это параметры, на которые я смотрел:

 String authType = request.getAuthType();
String pathInfo = request.getPathInfo();
String pathTranslated = request.getPathTranslated();
String getUserName = request.getRemoteUser();
String remoteAdd = request.getRemoteAddr();
String uriString = request.getRequestURI();
String sessionID = request.getRequestedSessionId();
String serverName = request.getServerName();
Integer serverPort = request.getServerPort();
String servletPath = request.getServletPath();
  

Я знаю, что некоторые из них, очевидно, не дадут мне ответа, который я ищу, но я полагаю, что один из параметров HttpServletRequest должен указывать странице входа в систему, которая просила ее отобразить. Любая помощь будет принята с благодарностью. Я собираюсь продолжить поиск ответа. Я пытался найти этот вопрос, но не нашел ответа.

Ответ №1:

Вместо самостоятельной реализации вам следует рассмотреть возможность использования аутентификации на основе формы для вашего веб-приложения.

Почти каждый контейнер сервлета поддерживает это.

Сначала вы должны настроить безопасность. Это зависит от вашего сервера приложений. Т.Е. С помощью Jetty вы можете использовать подход к базе данных с таблицами для пользователей и их ролей или LDAP и т. Д.

В web.xml вы включаете аутентификацию на основе формы:

 <login-config>
  <auth-method>FORM</auth-method>
  <form-login-config>
    <form-login-page>/logon.jsp</form-login-page>
    <form-error-page>/logonError.jsp</form-error-page>
  </form-login-config>
 </login-config>
  

Вы указываете две страницы JSP, которые вы должны предоставить. logon.jsp это страница входа для ввода имени пользователя и пароля. logonError.jsp отображается, если имя пользователя и пароль неверны.

Весь рабочий процесс входа в систему обрабатывается сервером приложений.

Если пользователь сначала переходит на защищенный URL-адрес, сервер приложений вместо этого представляет страницу входа. В качестве соглашения поля ввода для имени пользователя и пароля должны иметь имена j_username и j_password . Когда пользователь отправляет форму входа, сервер проверяет, действительны ли пользовательские идентификаторы (в соответствии с его конфигурацией). Если это так, пользователь перенаправляется на исходную страницу. В противном случае отображается страница ошибки входа в систему.

Если вы действительно хотите реализовать это самостоятельно, вы можете реализовать фильтр сервлетов, чтобы все вызовы защищенных ресурсов проходили ваш фильтр. В вашем фильтре вы можете проверить, присутствует ли уже сеанс и успешно ли пользователь вошел в систему. Затем может быть выполнен обычный вызов. В противном случае вы можете перенаправить на свою страницу входа и сохранить исходный URL-адрес в сеансе. После успешного входа в систему вы можете прочитать исходный URL-адрес из контекста сеанса и перенаправить на страницу, которую пользователь хотел увидеть в первую очередь.

Ответ №2:

Существуют разные способы сделать это. Один из способов — заставить вашу страницу входа поддерживать continue параметр CGI, который указывает URL-адрес, на который следует перенаправить после успешного входа в систему. Другой способ сделать это — использовать заголовок «Refererer», который был передан на страницу входа, и перенаправить на этот URL.

Для первого вы можете использовать ServletRequest.getParameterMap(), чтобы получить аргументы CGI и определить, есть ли параметр CGI с именем continue (или любое другое имя, которое вы решите присвоить этому параметру CGI); для последнего вы можете использовать HttpServletRequest.getHeader(), чтобы получить заголовок «Referer».