0

我有 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 个月经验)...

4

2 回答 2

1

总的来说,根本不建议在支付捕获时刷新最标准的页面方式,并且在大多数情况下,支付网关倾向于警告用户不要双击。刷新浏览器,因为它会使支付无效。

在几乎所有此类情况下,交易总是以无效模式结束。此外,处理此类用例更多的是支付网关而不是您的应用程序的责任。

如果他们有任何机制来处理这个双重提交问题,我建议你看看 ICICI payseal integration doc?

于 2012-07-27T10:30:32.813 回答
0

我的建议是在 tentativeBusbooking() 之后执行 redirectAction。在这种情况下,您将返回结果类型为redirectAction,而不是返回SUCCESS,而是返回诸如“bookingComplete”之类的结果。

结果将是仅显示的 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()。

于 2012-07-27T13:39:44.033 回答