我做了很多关于此事的研究,但似乎无法找到我的问题的答案,所以我希望你们能帮助我。
我们有一个struts 1.2.7 Web应用程序,我们使用Apache Struts Portlet Bridge转换为JSR-168 portlet。
这一切都很有效,除了一件事:指定重定向的actionforwards实际上并没有重定向到指定的操作。当应用程序作为普通的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中定义。 / p>
正如我所说,这一切都很有效,形成一个功能透视图,但当用户在呈现的订单 - 注册页面上点击f5时,再次调用action / CreateIdmAccountSubmit导致帐户被创建为double。正如我所说,当应用程序作为普通的Web应用程序运行时,这种情况并没有发生。在这里,该机制非常有效:)
我认为问题是由于重定向是在错误的阶段完成的,但我真的不确定为什么这不起作用:)
根据我读到的内容,我尝试了解决重定向问题的方法: *在struts-portlet-config.xml中指定了表单提交为“actionUrl”的操作(希望重定向在错误的阶段完成?) *用struts-portlet变量替换了普通的html标签库(希望我的html:form生成一个有效的url actionUrl,以某种方式使重定向成为可能?)
这两个步骤似乎没有帮助,我迷失了如何在portlet中完成一个简单的重定向,以便我们可以防止双重提交问题。
希望你们能帮助我!
答案 0 :(得分:2)
我找到了答案:机制取决于门户网站的实施。我们使用Liferay,默认情况下不能使用重定向。
但是,您可以通过在liferay-portlet.xml中声明一个名为
的元素来启用此功能<action-url-redirect>true</action-url-redirect>
这解决了我们的问题!