j_security_check с Primefaces

Как реализовать j_security_check с Primefaces? Обычно в JSP, если вы хотите использовать JAAS для входа в систему, форма входа обычно выглядит следующим образом:

<form action="j_security_check" method="POST">
   Username:<input type="text" name="j_username"><br>
   Password:<input type="password" name="j_password">
   <input type="submit" value="Login">
</form>

Но как нам реализовать это в JSF или в Primefaces!

  • Какая будет акция
  • Как нам избавиться от идентификатора или имени, такого как formId:componentId
  • Также p:commandButton по умолчанию ajaxified в Primefaces, так как же он отправляет форму без ajax?

У меня было требование внедрить аутентификацию формы JAAS с помощью Primefaces, и я делюсь решением здесь; может кому пригодится.


person Tapas Bose    schedule 29.11.2012    source источник
comment
Связанный/обман: заголовок stackoverflow.com/questions/2206911/   -  person BalusC    schedule 29.11.2012


Ответы (2)


Решение довольно простое.

  • Вам нужно определить h:form с prependId="false", чтобы он не генерировал идентификатор или имя компонента как formId:componentId.
  • Вам нужно определить action="j_security_check" в h:form как onsubmit="document.getElementById('login').action='j_security_check';"
  • Установите для атрибута ajax элемента p:commandButton значение false, чтобы форма не отправлялась в режиме ajax.

Вот и все. Вот полный код формы входа, которую можно заменить вышеупомянутой формой:

<h:form id="login" onsubmit="document.getElementById('login').action='j_security_check';" prependId="false">
    <h:panelGrid columns="2">
        <p:outputLabel for="j_username" value="Username" />
        <p:inputText id="j_username" name="j_username" />            
        <p:outputLabel for="j_password" value="Password" />
        <p:password id="j_password" name="j_password"/>
        <p:commandButton id="submit" value="Login" ajax="false"/>
    </h:panelGrid>
</h:form>

Спасибо.

person Tapas Bose    schedule 29.11.2012
comment
Вы можете просто использовать <form> вместо <h:form>. Нет необходимости в неприятном JS-коде (который сам по себе можно было бы упростить, удалив часть document.getElementById('login').). - person BalusC; 29.11.2012
comment
@BalusC извините за поздний комментарий, но похоже, что ни одно из них не является правильным решением. Я согласен с тем, что javascript уродлив, но если вы используете только <form>, вы не можете использовать id="submit" в p:commandButton, и поэтому вход в систему не будет работать... есть идеи, есть ли более чистое решение? - person OschtärEi; 07.06.2014
comment
@OschtärEi: Просто используйте <input type="submit"> с классами стиля PF. - person BalusC; 07.06.2014
comment
если вам не нужен id для <h:form>, просто используйте <h:form onsubmit="this.action='j_security_check';"> - person phse; 10.12.2014

Существует рабочий (с Primefaces 5) код (удалены атрибуты имени из p: inputText и p: password, удалены предложенные частью BalusC):

<h:form id="login" onsubmit="action='j_security_check';" prependId="false">
    <h:panelGrid columns="2">
        <p:outputLabel for="j_username" value="Username" />
        <p:inputText id="j_username" />            
        <p:outputLabel for="j_password" value="Password" />
        <p:password id="j_password" />
        <p:commandButton id="submit" value="Login" ajax="false"/>
    </h:panelGrid>
</h:form> 
person kosolapyj    schedule 22.01.2015