Почему нельзя написать страницу входа для аутентификации на основе форм в JSF?

Я только начинаю разрабатывать веб-приложения и начал с JSF 2.2 на Java EE 7, GlassFish 4.

Я думал, что начну с самых азов. Я просто хочу защитить весь сайт, поэтому каждая страница, на которую вы переходите, сначала потребует от вас аутентификации. Итак, я прочитал учебник по Java EE 7 и попробовал образцы, модифицировал их, а затем начал ломать их так, как я не думал, что они сломаются. Я пробовал разные ракурсы, но обычно попадал в две ситуации:

  1. Я бы попытался получить доступ к странице, используя частичный запрос, который приведет меня к /index.xhtml, как определено <welcome-file-list>, и мне будет предложено войти в систему; но при отправке имени пользователя/пароля я сразу же возвращаюсь к форме входа.
  2. Я добавил действие к <h:commandButton>, чтобы указать на index. Это сработало, но когда я отправил форму на странице индекса, которая должна была привести меня на страницу response.xhtml, я бы вернулся к форме входа, а не к странице ответа.

После многих часов блужданий по сети мне показалось, что причина, по которой я нарушил процедуру входа в систему, заключалась в том, что я изменил простую HTML-форму входа, чтобы использовать теги JSF, такие как <h:form>, вместо <form>.

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

Чтобы создать такую ​​страницу входа, сделайте фактическую форму входа HTML, а не JSF, и закодируйте ее в соответствии со стандартами j2EE для форм входа. Используйте тег формы HTML вместо формы JSF и убедитесь, что вы кодируете кнопку HTML SUBMIT, а не commandButton JSF!

Как только я изменил его на старый добрый HTML, он заработал. Но я не понимаю, почему. Кто-нибудь может меня просветить?! Я думаю, что мне не хватает чего-то фундаментального, что мне нужно понять, если я собираюсь начать писать веб-приложения в JSF.

Большое спасибо...


person Paul    schedule 25.07.2013    source источник


Ответы (1)


Это связано с тем, что <h:form> отправляет текущий URL-адрес (в терминах веб-разработки также известный как обратная передача), а не j_security_check, в то время как аутентификация на основе формы перехватывает j_security_check URL-адреса.

Однако неверно, что использование формы JSF для аутентификации на основе формы невозможно. Это вполне возможно, вам нужно только выполнить вход в резервный компонент, используя HttpServletRequest#login() самостоятельно.

Смотрите также:

person BalusC    schedule 26.07.2013
comment
Спасибо за быстрый ответ! Это интересно, поскольку я явно неправильно понимаю некоторые основы. С моим наивным взглядом на JSF я думал, что теги JSF — это просто представления их простых HTML-аналогов, тем не менее функционально одинаковые. - person Paul; 29.07.2013
comment
(Извините, не было закончено, я не думал, что нажатие возврата на моем iPhone отправит комментарий - тогда время редактирования истекло!) Поэтому, хотя метод «действие» тега формы одинаков для обоих представлений (HTML/JSF) , один делает то, что другой не делает. Является ли это специфичным только для тега формы или другие теги демонстрируют различное поведение между JSF/HTML? - person Paul; 29.07.2013
comment
<h:form> не поддерживает атрибут action. Это полностью игнорируется. JSF генерирует свой собственный, который указывает на текущий URL-адрес. - person BalusC; 29.07.2013
comment
Ах, это бы объяснило! Большое спасибо за вашу помощь. Из интереса, откуда ты это знаешь? Есть ли хорошие книги/ресурсы, которые вы бы порекомендовали? Я не уверен, что это было упомянуто в уроке, и думаю, мне понадобится более подробный материал, чтобы разобраться с этим. - person Paul; 29.07.2013
comment
Проверьте документацию по тегу: docs.oracle. com/javaee/6/javaserverfaces/2.1/docs/vdldocs/ Во введении к документации по тегу упоминается, что значение атрибута действия должно быть результатом передачи идентификатора представления текущего представления в getActionURL() ViewHandler для этого приложения. Атрибут action также не указан в атрибутах. Автозаполнение IDE/intellisense также не будет отображать его. С другой стороны, просмотр исходного кода FormRenderer также должен дать подсказки. - person BalusC; 29.07.2013
comment
Похоже, я не очень оценил этот комментарий в Учебное пособие по Java EE 7: Формы Facelets с использованием тегов h:form, h:inputText и h:inputSecret автоматически генерируют идентификаторы действий и ввода, что означает, что разработчики не могут указать j_security_check как действие формы ... Еще раз спасибо за помощь. - person Paul; 30.07.2013