我的应用程序有一个“自定义”(JSF)登录页面。我的公司使用 Siteminder 进行身份验证。因此,为了使用“自定义”页面登录到 Siteminder,我必须有一个表单,该表单使用适当的表单字段(用户名/密码和几个 Siteminder 特定的隐藏字段)发布到 /login.fcc。
我正在尝试做的是继续利用 JSF 的表单验证等,并且仍然发布到 login.fcc。
这是我的自定义表单的精简版:
<rich:messages />
<h:form id="adminLogin" prependId="false">
<h:panelGrid columns="2" styleClass="center">
<h:outputLabel value="HUB USERNAME:" />
<h:inputText id="USER" label="Username" size="12" required="true" />
<h:outputLabel value="HUB PASSWORD:" />
<h:inputSecret id="PASSWORD" label="Password" size="12" required="true" />
<input type="hidden" name="target" value="#{loginController.smTarget}" />
<input type="hidden" name="smagentname" value="#{loginController.smAgentName}" />
</h:panelGrid>
<h:panelGroup layout="block" styleClass="max-width button-panel">
<a4j:commandButton id="adminLoginBtn" value="LOGIN"
styleClass="login-btn"
action="#{loginController.managerLogin}" />
</h:panelGroup>
</h:form>
请注意,我对 target 和 smagentname 字段使用了标准隐藏输入。这是因为我不需要在控制器中为这些字段同时设置 setter 和 getter。我只是希望控制器在页面呈现时提供值。
我的控制器方法如下所示:
public void managerLogin()
{
LoginController.LOG.debug("manager is logging in...");
LoginController.LOG.debug("user: " + getRequestParameterValue("USER"));
LoginController.LOG.debug("smagent: " + getRequestParameterValue("smagentname"));
LoginController.LOG.debug("target: " + getRequestParameterValue("target"));
forwardTo(LoginController.SM_LOGIN_FCC);
}
您可以看到我正在记录除密码字段之外的所有字段的值,并且它们都在我的日志中正确打印......所以我知道我正在获取这些值。我的“forwardTo()”方法只是获取 ExternalContext 并在其上调用 dispatch()...传递到 login.fcc 页面的路径(即“/forms/login.fcc”)。
当我在表单中输入值并单击登录按钮时,我会在控制台中看到我的值,但我会在浏览器中收到 404 消息。
我可以手动将“/forms/login.fcc”页面放在地址行中,并且 GET 呈现 login.fcc 页面没有问题。但我当然不想呈现我想执行 Siteminder 登录(通过 POST)的 login.fcc (GET)。
我的理解是,所有请求参数都可以通过我期望这工作的转发过程获得。
我可以采用相同的表单并将其取消 JSF 化...并使登录按钮只需提交表单(其操作将是 /forms/login.fcc 通过 POST 并且它也可以正常工作,但随后我松开了JSF 提供的表单/字段验证的好处。
有任何想法吗?