我对此事做了很多研究,但似乎找不到我的问题的答案,所以我希望你们能帮助我。
我们有一个 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 中完成一个简单的重定向,以便我们可以防止双重提交问题。
希望你们能帮帮我!