9
回答
springmvc如何想struts2那样防止重复提交?

每天提一个问题

举报
osrchina
发帖于6年前 9回/5K+阅
共有9个答案 最后回答: 2年前

SpringMVC用同一个URL对应不同请求方法,比如你输入地址,回车单击,发送的是GET请求,这时界面上看到的是请求界面。当你在表单里面填好值,点击页面的提交按钮,同样一个URL会作为POST请求提交,两个对应在SpringMVC的Controller里面的处理方法不同的。

至于像Struts2里面的token防止重复提交,这更应该是开发者自己考虑的吧。

--- 共有 1 条评论 ---
osrchina完全没帮助 6年前 回复

1.Use JavaScript to disable the button a few ms after click. This will avoid multiple submits being caused by impatient users clicking multiple times on the button.

2.Send a redirect after submit, this is known as Post-Redirect-Get (PRG) pattern. This will avoid multiple submits being caused by users pressing F5 on the result page and ignoring the browser warning that the data will be resend, or navigating back and forth by browser back/forward buttons and ignoring the same warning.

3.Generate an unique token when the page is requested and put in both the session scope and as hidden field of the form. During processing, check if the token is there and then remove it immediately from the session and continue processing. If the token is not there, then block processing. This will avoid the aforementioned kinds of problems.

In Spring you can use RedirectView as implementation of the PRG pattern (as described in point 2). The other two points needs to be implemented yourself.

原理:

在Session中保存一个表单的唯一编号,将该编号放在一个隐藏域中,同其他数据一同提交。在提交表单后,通过拦截器或其他机制检查唯一编号,如果存在则说明表单是第一次提交,如果不存在则被重复提交(理由很简单,在第一次提交检查后就会从Session中移除该编号)。保存编号可以用一个 HashMap。

--- 共有 2 条评论 ---
osrchina我现在也是这么干的 6年前 回复
osrchina谢谢回答 6年前 回复

引用来自“whaon”的答案

原理:

在Session中保存一个表单的唯一编号,将该编号放在一个隐藏域中,同其他数据一同提交。在提交表单后,通过拦截器或其他机制检查唯一编号,如果存在则说明表单是第一次提交,如果不存在则被重复提交(理由很简单,在第一次提交检查后就会从Session中移除该编号)。保存编号可以用一个 HashMap。

不理解,第一次提交编号应该不存在啊,是不是说反了

引用来自“wuguoqin”的答案

返回视图时加上redirect:视图名称
谢谢,这种方法确实可行吗?我真的没有试过,你们的网站通过一些xss攻击工具的测试吗?

....既然知道struts就可以模仿struts,这个和框架其实没关系。

原理:在session里保存一份 token,每次提交刷新下session里的token.

例如,每次请求A.JSP ,动态生成个session值,然后按submit时,

1,检查session里的 token(如果session已经相等,说明是重复提交,不做任何处理)

2,如果session不存在 token或者 token不相等,那么判断为非重复提交


当然此种方法还可以和JS同时使用,加强用户体验,比如每次提交,提交按钮变成灰色

顶部