2

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コンポーネントによって検出されません。また、ボタンのAjaxの動作に問題がある可能性があるという考えに切り替えましたp:commandButtonが、PrimeFacesがCommandButtonがフォーム要素内にないことについて不平を言っているため、ページはレンダリングされません。コンテナによってスローされる例外は次のとおりです。

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

要約すると、2つの質問があります。

  1. フォームが送信される前に、パスワードが見つからないためにメッセージが生成されないのはなぜですか?
  2. LoginExceptionをキャッチして、ダイアログ内にエラーメッセージを表示するにはどうすればよいですか?
4

1 に答える 1

6

j_security_checkリクエストは、JSFではなくWebコンテナによって処理されます。それは required="true"うまくいかないことを説明しています。コマンドボタンに関連付けられたアクションメソッドでJSF<h:form>とプログラムによるログインを使用する場合にのみ機能します。HttpServletRequest#login()

あなたができる最善のことは、とまったく同じURL<form-error-page>web.xml指すように構成すること<form-login-page>です。次に、リクエストが自動的に転送されたかどうかを確認でき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>、外部ではなく、本体に配置する方が適切です。JSによる<p:dialog>缶は本体の端に移動されるため、形状が崩れます。

于 2012-04-29T04:30:34.817 に答える