0

我对此事做了很多研究,但似乎找不到我的问题的答案,所以我希望你们能帮助我。

我们有一个 struts 1.2.7 Web 应用程序,我们使用 Apache Struts Portlet Bridge 将其转换为 JSR-168 portlet。

这一切都很好,除了一件事:指定重定向的动作转发实际上并不重定向到指定的动作。当将应用程序作为普通的 struts Web 应用程序运行时,这些重定向确实有效。因此,我们在 portlet 变体中存在双重提交问题。

我们使用以动作转发到图块定义结束的动作链。例如:

<action path="/CreateIdmAccountSubmit"  validate="true"   input="catalog.createaccount.page" type="com.konakart.actions.login.CreateIdmAccountSubmitAction" name="CreateIdmAccountForm">
        <forward name="FillRegistrationData" path="/FillRegistrationData.do" redirect="true"/>
    </action>

<action path="/FillRegistrationData" validate="false" type="com.konakart.actions.registration.FillRegistrationDataAction" name="FillRegistrationDataForm">
        <forward name="FillRegistrationDataPage" path="/FillRegistrationDataPage.do" redirect="false"/>
    </action>

<action path="/FillRegistrationDataPage" forward="order.registrationdata.page"/> (tiles-def)

在此示例中,操作/CreateIdmAccountSubmit处理提交的表单 (POST) 并在数据库中创建一个帐户。成功创建后,用户被重定向到另一个动作(/FillRegistrationData),该动作初始化一个订单对象,然后转发到在tiles-defs.xml 中定义的布局的订单注册页面。

正如我所说,这一切都很好,从功能角度来看,但是当用户在呈现的订单注册页面上点击 f5 时,再次调用操作 /CreateIdmAccountSubmit 导致帐户被创建双倍。正如我所说,在将应用程序作为普通 Web 应用程序运行时也不会发生这种情况。在这里,该机制完美运行:)

我认为问题是由于重定向是在错误的阶段完成的,但我真的不确定为什么这不起作用:)

根据我阅读的内容,我尝试了以下方法来解决重定向问题: * 在 struts-portlet-config.xml 中将表单提交的操作指定为“actionUrl”(希望重定向是在错误的阶段完成的?) * 替换struts-portlet 变体的普通 html 标记库(希望我的 html:form 生成了一个有效的 url actionUrl,以某种方式使重定向成为可能?)

这两个步骤似乎没有帮助,我不知道如何在 portlet 中完成一个简单的重定向,以便我们可以防止双重提交问题。

希望你们能帮帮我!

4

1 回答 1

2

我找到了答案:机制依赖于门户实现。我们使用默认情况下不支持重定向的 Liferay。

但是,您可以通过在 liferay-portlet.xml 中声明一个名为

<action-url-redirect>true</action-url-redirect>

这为我们解决了问题!

于 2012-07-26T09:01:52.407 回答