关于防止表单重复提交的做法有很多,本人知道的有如下,只是简单讲讲,大家觉得什么办法最简单又有效?
1.有redis的环境
把提交的动作action,参数之类的作为redis的key,存进redis,设置一个很短的缓存时间,提交的时候判断如果存在这个key,说明是重复提交数据。
2.jquery前端判断
除了在程序端判断重复提交外,在页面前端也加一层措施,如点击提交按钮,按钮状态不可用(有的按钮用的a标签),如果不是按钮button,可以用jquery在提交的时候设置一个属性值,如果有了这个属性值,表示已经提交。
$("body").data("applycancel","unlock");
3.表单隐藏域token
生成一个随机数,放进session,给表单加一个隐藏域放进token,提交的时候判断表单的token隐藏域和session的值是否一致,如果不一致表示重复提交,处理表单的时候unset掉这个session。
各位还有什么办法,什么办法最好,谢谢!
Utilisez Etag pour implémenter un mécanisme de verrouillage optimiste dans le contrôle de concurrence. L'exemple suivant ne se limite pas aux soumissions répétées :
Dans un scénario simultané, lorsque plusieurs clients exploitent la même ressource en même temps, une situation se produira : la ressource exploitée par le client est modifiée dans des circonstances inconnues.
Un exemple simple :
L'utilisateur A a publié un message avec le contenu
post-a
. L'utilisateur B a vupost-a
puis a écrit un commentaire ci-dessous. Pendant que B écrivait le commentaire, l'utilisateur A a modifié le contenu du message enpost-aa
. Un problème qui va se poser est que le commentaire écrit par l'utilisateur B pourpost-a
semble bizarre^_^La solution est très simple. Lorsque B voit A, donnez-lui une balise d'identification de ressource de publication-1. Lorsque B soumet un commentaire, il le soumet avec cette balise d'identification-1. Le serveur vérifie les conditions a priori avant d'accepter la demande. S'il n'y a aucun changement dans le contenu de la publication à ce moment-là, il s'agit toujours de la balise 1, ce qui signifie le succès.
Si le contenu de la publication change, le nouvel ID est la balise-2, qui ne correspond pas à la balise-1 soumise par B, indiquant que les ressources ont changé au cours de la période, et 412 Precondition Failed est renvoyé. Actualisez ensuite la page ou l'invite, informez B de ce changement et continuez à commenter.
La situation de l'API est similaire, il vous suffit d'ajouter un identifiant aux ressources renvoyées.
Générez une valeur de hachage à partir des paramètres transmis et stockez-la dans le champ hash_code de la base de données. Ce champ est utilisé comme index unique. Et chaque fois qu'elle est insérée dans la base de données, une valeur de hachage est générée de la même manière pour déterminer si la valeur de hachage existe.