为了替换默认的Spring安全登录表单,我提出了这个解决方案:
<form name="f" action="../j_spring_security_check" method="POST" > <h:panelGrid columns="2"> <h:outputText value="Username" /> <h:inputText id="j_username" /> <h:outputText value="Password" /> <h:inputText id="j_password" /> </h:panelGrid> <h:commandButton value="Login" /> </form>
但不是简单的< form>标签我想使用< h:form>因为Primefaces组件只能在< h:form>内工作.使用< h:form>表单操作将由JSF自动设置到当前页面,而不是上面示例中我设置的值.我现在必须在哪里编写动作“../j_spring_security_check”?我尝试将它放入< h:commandButton>如下,但不起作用:
<h:form name="f"> <h:panelGrid columns="2"> <h:outputText value="Username" /> <h:inputText id="j_username" /> <h:outputText value="Password" /> <h:inputText id="j_password" /> </h:panelGrid> <h:commandButton value="Click here" action="../j_spring_security_check" /> </form>
它导致错误消息无法找到与from-view-id’/ login.xhtml’匹配的导航案例,用于行动’../j_spring_security_check’,结果为’../j_spring_security_check’.
这是在faces-config.xml中定义导航案例的唯一方法吗?我想避免在这个简单的用例中使用bean.
解决方法
对我来说最好的解决方案是使用默认的< button>标签代替.由于没有应用典型的按钮样式(在我的情况下我使用的是Primefaces),我手动设置它.这是整个结果:
<h:outputStylesheet library="primefaces" name="jquery/ui/jquery-ui.css" /> <h:outputStylesheet library="css" name="login.css" /> <div class="message"> <c:if test="#{param.error == 1 and SPRING_SECURITY_LAST_EXCEPTION != null}"> <span class="error">#{SPRING_SECURITY_LAST_EXCEPTION.message}</span> </c:if> </div> <div class="login"> <form action="../j_spring_security_check" method="post"> <h:panelGrid columns="2"> <h:outputText value="Username" /> <h:inputText id="j_username" /> <h:outputText value="Password" /> <h:inputSecret id="j_password" /> </h:panelGrid> <div class="submit"> <button type="submit" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"> <span class="ui-button-text">Login</span> </button> </div> </form> </div>