避免重复提交这个问题在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的时候,要对数据在后台进行更加严格和全面的校验。
分享到:
相关推荐
在Web开发中,尤其是使用JavaServer Pages (JSP) 技术时,页面表单的重复提交是一个常见的问题。这可能会导致数据不一致或者服务端处理逻辑错误。本篇文章将探讨如何有效地防止JSP页面中的表单重复提交,确保系统的...
8. **表单重定向(Redirect after Post)**:这是一种经典的防止重复提交的方法,提交表单后立即重定向到新的URL,这样即使用户再次点击提交,也会被重定向页面拦截。 9. **使用HTML5的formnovalidate属性**:对于...
使用数据库insert操作时,使用唯一索引可以避免重复提交。 ### 5. 借助悲观锁 使用悲观锁, select … for update,可以避免重复提交,但是要避免死锁。 ### 6. 借助本地锁 使用本地锁,例如使用...
如果发现`token`无效,拦截器会抛出异常,导致Action不再执行,从而避免重复提交。配置`token`拦截器通常涉及到在Action类或包配置中添加`token`或`token-session`拦截器。`token-session`拦截器在处理多窗口或并发...
除了直接使用redirect,还可以使用redirectAction,并在result中配置actionName参数,这样提交后会通过另一个action来执行,从而避免了直接刷新带来的重复提交问题。 在具体实现上,通过修改result元素的type属性来...
在Servlet中,通常采用几种方法来避免重复提交: 1. **Session状态管理**:在接收到用户提交请求后,可以在Session中设置一个标志,如"formSubmitted",然后在后续的请求中检查这个标志,如果已存在则忽略请求。 2...
使用Ajax进行异步提交可以避免整个页面的刷新,从而降低重复提交的风险。这种方式适用于需要实时反馈的场景。 ##### 方法7:Struts框架中的重定向 在Struts框架中,可以通过配置文件实现重定向,防止重复提交: ```...
在VB.NET中,防止网页重复提交是一个重要的议题,特别是在处理敏感数据或执行关键操作时,重复提交可能导致数据不一致或系统资源浪费。本教程将详细解释如何通过多种方法实现这一功能,结合提供的源码,我们可以深入...
这种方式可以防止浏览器重定向,避免了F5刷新导致的重复提交。但是,如果用户手动刷新页面,仍有可能引发问题。 2. 使用`Response.sendRedirect()`方法: `resp.sendRedirect(req.getContextPath() + "/manager/...
当尝试插入重复数据时,数据库会返回错误,从而避免重复提交。 5. **JavaScript前端控制**: 在客户端使用JavaScript检测表单是否已经被提交过。一旦提交,可以禁用提交按钮,或者显示提示信息告知用户不应再进行...
使用浏览器后退按钮重复之前的操作,导致重复提交表单。 使用浏览器历史记录重复提交表单。 浏览器重复的HTTP请求。 几种防止表单重复提交的方法 禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。这种...
在Java服务器页面(JSP)中,防止重复...以上策略可以单独使用,也可以组合使用,以提供更强大的重复提交防护。选择哪种方法取决于具体的应用场景和安全需求。在实际开发中,通常会结合使用多种方法,以达到最佳效果。
在Web开发中,表单重复提交是一个常见的问题,可能导致数据不一致或处理逻辑的混乱。Struts2提供了多种方法来防止这种情况,其中一种是通过重定向来实现。下面将详细解释Struts2如何通过重定向来防止表单重复提交。 ...
- **页面跳转(Redirect After Post)**:处理完请求后,使用`redirect`或`redirectAction`结果,将用户重定向到新的URL,避免回退按钮导致的重复提交。 4. **Struts2配置** 对于以上功能的实现,Struts2的配置...
4. 使用 JavaScript 代码,禁用提交按钮,避免重复提交。 提交" onclick="this.disabled=true;this.form.submit()"> 5. 在 JSP 页面的 FORM 表单中添加一个隐藏域,用于记录当前请求的 URL,在服务器端代码中使用...
在Web开发中,防止表单重复提交是一个常见的需求,尤其在使用PHP框架如ThinkPHP时。表单重复提交可能导致数据不一致,影响系统的稳定性和用户体验。本文将详细讲解如何在ThinkPHP框架中防止表单重复提交,通过实例...
2. **使用Post/Redirect/Get模式**:即在表单提交后进行重定向操作,从而避免浏览器的刷新操作导致的重复提交。 3. **前端限制**:利用JavaScript控制表单的提交行为,例如禁用提交按钮或使用AJAX异步提交等方式减少...