我在这件事上做了很多研究,但似乎找不到我问题的答案,所以我希望你们能帮助我。
我们有一个struts 1.2.7 web应用程序,我们使用将其转换为一个JSR-168 portlet。
这一切都很好,除了一件事:指定重定向的动作实际上不会重定向到指定的动作。这些重定向工作时,运行应用程序作为一个正常的struts网络应用程序。因此,在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),并在db中创建一个帐户。在成功创建之后,用户将被重定向到另一个操作(/FillRegistrationData),该操作位于order对象中,然后依次转发到在tiles-defs.xml中定义布局的Order配准页面。
正如我说的,这一切都很好,形成一个功能透视图,但是当用户点击呈现的订单注册页面上的f5时,操作/CreateIdmAccountSubmit再次被调用,导致帐户被创建成双倍。正如我说过的,当将应用程序作为正常的web应用运行时,这种情况不会发生。在这里,该机制工作得非常完美:)
我认为问题是因为重定向是在错误的阶段进行的,但我真的不清楚为什么这样做是行不通的:)
基于我所读到的,我尝试了各种方法来解决重定向问题:*将表单提交的操作指定为struts-portt-config.xml中的" actionUrl“(希望重定向是在错误的阶段完成的?)*将普通的html标记库替换为struts-portlet变体(希望我的html生成了一个有效的url actionUrl:表单在某种程度上使重定向成为可能?)
这两个步骤似乎没有帮助,我不知道如何在portlet中完成简单的重定向,以防止双重提交问题。
希望你们能帮我一把!
发布于 2012-07-26 09:01:52
我找到了答案:该机制依赖于门户实现。我们使用Liferay,它在默认情况下不适用于重定向。
但是,您可以通过声明一个名为-portlet.xml的元素来打开它
<action-url-redirect>true</action-url-redirect>这解决了我们的问题!
https://stackoverflow.com/questions/10818497
复制相似问题