为了替换默认的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>
会出现错误消息 Unable to find matching navigation case with from-view-id '/login.xhtml' for action '../j_spring_security_check' with outcome '../j_spring_security_check'
。
这是在faces-config.xml
中定义导航案例的唯一方法吗?我想避免在这个简单的用例中使用bean。
答案 0 :(得分:8)
对我而言,最好的解决方案是使用默认的<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>
答案 1 :(得分:7)
<h:form id="login" prependId="false" onsubmit="document.getElementById('login').action='j_security_check';">
答案 2 :(得分:1)
您的action属性应该是EL表达式,如下所示:
action="#{managedBean.method}"
答案 3 :(得分:1)
您最好的机会是使用按钮的 onclick 属性。这是一个带有primefaces commandButton的示例,但它也适用于jsf组件,因为它使用(本机)javascript onclick函数。
<h:form>
<p:commandButton value="Submit" onclick="alert('JS!')" actionListener="#{tweetBean.addTweet()}" update=":tabView,:trends,:tweetsnr" />
</h:form>