j_security_check与Primefaces相关

4
如何在Primefaces中实现j_security_check?通常在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的id��名称
  • 此外,默认情况下,p:commandButton在Primefaces中进行了AJAX处理,那么它如何以非AJAX方式提交表单

我有一个要求,在Primefaces中实现JAAS表单身份验证,并在此分享解决方案。这对某些人可能会很方便。


1
相关/重复:https://dev59.com/8XE95IYBdhLWcg3wrP0o#2207147 - BalusC
2个回答

18

解决方案非常简单。

  • 您需要使用prependId="false"来定义h:form,这样它就不会将组件的id或名称生成为formId:componentId
  • 您需要在h:form中定义action="j_security_check",并将其设置为onsubmit="document.getElementById('login').action='j_security_check';"
  • p:commandButtonajax属性设置为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>

谢谢。


6
你可以只使用 <form>,无需使用 <h:form>。不需要那个令人讨厌的 JS 代码(同时也可以通过删除 document.getElementById('login'). 部分来简化)。 - BalusC
@BalusC抱歉晚了一点评论,但似乎两者都不是正确的解决方案。我同意JavaScript很丑陋 - 但如果你只使用<form>,你就不能在p:commandButton中使用id="submit",因此登录将无法工作...有没有更简洁的解决方案? - OschtärEi
1
@OschtärEi:只需在<input type="submit">上使用PF样式类即可。 - BalusC
如果您不需要为<h:form>使用id,只需使用<h:form onsubmit="this.action='j_security_check';">即可。 - phse

2

以下是与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> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接