使用redirect避免重复提交

避免重复提交这个问题在Web应用开发领域应该是一个老生常谈的问题了,主流的一些Web应用框架也提供了方便使用的功能来实现这个需求,比如 Struts的Token。但是有些时候,可能用户确实需要刷新提交之后所转到的页面,比如假设如下的需求:用户注册了一个账号,但是这个账号需要管理员批准才可以进行工作,于是,用户在注册页面填写了详细信息之后,提交,转到详细信息页面,然后刷新这个页面来查看自己的状态。此时,我觉得使用 redirect是非常方便的。

以下是redirect在Struts1和Struts2中的实现:



Struts1:

在 Struts1中,有一个org.apache.struts.action.ActionRedirect的类,这个类是ActionForward类的子类,是专门用来做redirect跳转的。使用起来非常的简单,只需在你的Action类的方法中,返回一个ActionRedirect类的实例即可。

----------------------------------------------------

ActionRedirect redirect = new ActionRedirect(mapping.findForward("detailAction")); // 这里是在struts-config.xml文件中定义的<forward>节点的name属性
redirect.addParameter("id", user.getId()); //这里是要在url后面附加的参数名称及其值

return redirect;

----------------------------------------------------



Struts2:

在Struts2中,情况有所不同。但是Struts2里面的方式,更加的合理,因为不需要在Action代码中编码来完成,完全是通过配置完成的。在配置文件struts.xml中,

----------------------------------------------------

        <action name="userCreate" method="create" class="lab.action.UserAction">
<result name="detailAction" type="redirect-action">
<param name="actionName">userDetail</param>
<param name="namespace">/</param>
<param name="parse">true</param>
<param name="user.id">${user.id}</param>
</result>
</action>
<action name="userDetail" method="detail" class="lab.action.UserAction">
<result name="detailPage">userDetail.jsp</result>
</action>


----------------------------------------------------



这里,userCreate是创建用户的Action,userDetail是查看用户详细信息的Action,都是由类 lab.action.UserAction来提供工作。如果从一个action redirect到另外一个action,那么redirect的result的type为redirect-action。

其中,参数actionName为要跳转到的action的name,无需.action后缀,struts框架会根据你配置的属性来确定后缀是什么。 namespace为搜索action时使用的命名空间。parse是表示要对参数进行解析。后面的几个参数就是根据实际需要来定义参数名称和参数的值,这里会由struts框架将这些参数附加到URL后面。例如在上面的例子中,user.id为参数名,${user.id}为参数值,该值通过解析 userCreate对应的类中的user属性的id属性来得到,和在jsp页面使用方式相同,其实都是来自于Value Stack。



如果是要redirect到一个jsp页面,并且带有参数(这种情况应该很少),按照struts2的文档描述:

----------------------------------------------------

<result name="success" type="redirect">
<param name="location">foo.jsp</param>
<param name="parse">false</param>
</result>

<package name="passingRequestParameters" extends="struts-default" namespace="/passingRequestParameters">
<-- Pass parameters (reportType, width and height) -->
<!--
The redirect-action url generated will be :
/genReport/generateReport.jsp?reportType=pie&width=100&height=100
-->
<action name="gatherReportInfo" class="...">
<result name="showReportResult" type="redirect">
<param name="location">generateReport.jsp</param>
<param name="namespace">/genReport</param>
<param name="reportType">pie</param>
<param name="width">100</param>
<param name="height">100</param>
</result>
</action>
</package>


----------------------------------------------------
另外,对于比如查询统计这样的功能,用户刷新页面的几率是非常大的,这种情况下,建议使用get方式来提交form,以避免IE那个总是跳出来的对话框。

相比于forward方式的跳转而言,redirect的跳转会在浏览器地址栏暴露更多的信息,可能会被使用者恶意篡改,所以在使用redirect的时候,要对数据在后台进行更加严格和全面的校验。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值