gpt4 book ai didi

JSF 身份验证 : cannot intercept error messages

转载 作者:行者123 更新时间:2023-12-02 20:12:09 24 4
gpt4 key购买 nike

我开发了一个简单的登录表单,用于我的 JSF + PrimeFaces 页面:

<form action="j_security_check" method="post"> 
<p:dialog modal="true" header="Login" widgetVar="loginDlg">
<h:panelGrid columns="3" cellpadding="5">
<h:outputLabel for="j_username">Username:</h:outputLabel>
<h:inputText id="j_username" required="true" />
<h:message for="j_username" />
<h:outputLabel for="j_password">Password:</h:outputLabel>
<h:inputSecret id="j_password" required="true" />
<h:message for="j_password" />
<br />
<h:commandButton value="Login" />
</h:panelGrid>
</p:dialog>
</form>

尝试使用空密码,但 h:message 组件无法捕获丢失的密码(必需的)。我还切换到 p:commandButton ,认为问题可能出在按钮的 Ajax 行为中,但页面未呈现,因为 PrimeFaces 提示 CommandButton 不在表单元素内。容器抛出的异常是:

com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Access denied on empty password for user pippo

总而言之,我有两个问题:

  1. 为什么在提交表单之前缺少密码不会生成消息?
  2. 如何捕获 LoginException 并在对话框中显示错误消息?

最佳答案

j_security_check请求由 Web 容器处理,而不是由 JSF 处理。这就解释了required="true"行不通的。它仅在您使用 JSF 时才有效 <h:form>以及通过 HttpServletRequest#login() 进行编程登录在与命令按钮关联的操作方法中。

您能做的最好的事情就是配置 <form-error-page>web.xml指向与 <form-login-page> 完全相同的 URL 。然后您可以检查该请求是否已由 j_security_check 转发。本身,这意味着发生了登录错误。

<h:panelGroup rendered="#{requestScope['javax.servlet.forward.servlet_path'] == '/j_security_check'}">
<h:outputText value="Unknown login, please try again" styleClass="error" />
</h:panelGroup>

使用此代替 <h:message> .

至于为什么<p:commandButton>提示没有表格只是因为您没有使用 <h:form> .

<小时/>

与具体问题无关<form> (或 <h:form> 每当您决定切换到编程登录时)最好放在 <p:dialog> 的正文中,不在外面。 <p:dialog>可以通过 JS 重新定位到正文的末尾,这将导致它不再处于表单中。

关于JSF 身份验证 : cannot intercept error messages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10367152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com