关于防止表单重复提交的做法有很多,本人知道的有如下,只是简单讲讲,大家觉得什么办法最简单又有效?
1.有redis的环境
把提交的动作action,参数之类的作为redis的key,存进redis,设置一个很短的缓存时间,提交的时候判断如果存在这个key,说明是重复提交数据。
2.jquery前端判断
除了在程序端判断重复提交外,在页面前端也加一层措施,如点击提交按钮,按钮状态不可用(有的按钮用的a标签),如果不是按钮button,可以用jquery在提交的时候设置一个属性值,如果有了这个属性值,表示已经提交。
$("body").data("applycancel","unlock");
3.表单隐藏域token
生成一个随机数,放进session,给表单加一个隐藏域放进token,提交的时候判断表单的token隐藏域和session的值是否一致,如果不一致表示重复提交,处理表单的时候unset掉这个session。
各位还有什么办法,什么办法最好,谢谢!
高洛峰2017-04-24 09:12:06
Etag를 사용하여 동시성 제어에서 낙관적 잠금 메커니즘을 구현합니다. 다음 예는 반복 제출에 국한되지 않습니다.
동시 시나리오에서 여러 클라이언트가 동시에 동일한 리소스를 운영하는 경우 상황이 발생합니다. 클라이언트가 운영하는 리소스가 알 수 없는 상황에서 변경됩니다.
간단한 예:
A라는 사용자가 post-a
라는 내용으로 게시물을 올렸습니다. B라는 사용자가 post-a
을 보고 아래에 댓글을 달았는데, A라는 사용자가 해당 게시물의 내용을 post-aa
으로 변경했습니다. 발생할 수 있는 문제 중 하나는 사용자 B가 post-a
에 쓴 댓글이 이상해 보인다는 것입니다^_^
해결 방법은 매우 간단합니다. B가 A를 보면 게시물 리소스 식별 태그-1을 제공합니다. B가 댓글을 제출하면 이 식별 태그-1과 함께 제출됩니다. 서버는 요청을 수락하기 전에 사전 조건을 확인합니다. 당시 게시물 내용에 변경 사항이 없으면 여전히 태그-1이며 이는 성공을 의미합니다.
게시물의 내용이 변경되면 새 ID는 tag-2로 B가 제출한 tag-1과 일치하지 않아 해당 기간 동안 리소스가 변경되었음을 나타내며 412 Precondition Failed가 반환됩니다. 그런 다음 페이지나 프롬프트를 새로 고치고 B에게 이 변경 사항을 알리고 계속 댓글을 남깁니다.
API 상황도 비슷합니다. 반환된 리소스에 식별자만 추가하면 됩니다.
伊谢尔伦2017-04-24 09:12:06
전달된 매개변수에서 해시 값을 생성하고 이를 데이터베이스의 hash_code 필드에 저장합니다. 이 필드는 고유 인덱스로 사용됩니다. 그리고 데이터베이스에 삽입될 때마다 동일한 방식으로 해시값이 생성되어 해당 해시값이 존재하는지 확인합니다.