#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».