我有struts2动作方法。它将从不同的服务器调用。即在我们的应用程序中,我们正在集成icici支付网关。我的动作方法将从icici服务器调用。在那种方法中,我正在执行一些逻辑。基于逻辑,它将被重定向到其他一些动作。
<action name="iciciResponse" class="com.yatrasoft.yatratravel.agent.b2c.PaymentGateWayAction" method="iciciResponse">
<result name="buybusTicket" type="redirect">/tentativeBusbooking.action?searchKey=${getSearchKey()}</result>
</action>
我的预订逻辑出现在 tentativeBusbooking()中。执行此方法后,结果将显示给最终用户。现在浏览器URL就是这样的。
http://192.168.0.94:8080/travelyatra/tentativeBusbooking.action?searchKey=NDIwMTMzMDR8MTQ5OTA4MjF8bnVsbHxudWxsfG51bGx8bnVsbHxudWxsfG51bGx8bnVsbHxudWxsfHxud
但问题是,如果用户刷新浏览器, tentativeBusbooking()将再次执行。
如果我有JSP页面,通过使用 s:token ,我们可以避免双表单提交。但我的动作是直接从其他服务器调用的。那么,如何在这种情况下避免双重提交。
如果我需要为此编写自己的逻辑,请帮助我。我是实习生/工程师(仅5个月经验)......
答案 0 :(得分:0)
我的建议是在tentativeBusbooking()之后执行redirectAction。在这种情况下,您将返回结果类型为redirectAction的结果,例如“bookingComplete”,而不是返回SUCCESS。
结果将是仅显示jsp,如果页面被刷新,则仅显示结果,而不是原始提交。
例如:
@Results({
@Result(name = "success", location = "/WEB-INF/content/tentativeBusbooking.jsp"),
@Result(name = "bookingComplete", type="redirectAction" location = "booking")})
public class BoxController extends ActionSupport{
public void execute(){
return SUCCESS;
}
public void tentativeBusbooking(){
//Do stuff...
return "bookingComplete";
}
在上面带注释的示例中,bookingComplete结果将结果类型会在tentativeBusbooking()调用execute()而不是在刷新时再次使用tentativeBusbooking()之后将操作重定向回自身。