我有一个HTML表单,有时提交,有时不提交。表单是使用一个按钮提交的,该按钮使用javascript验证表单,然后使用javascript提交它:
<form id="my-form">
<input type="hidden" name="csrf-token">
<input type="text" name="1">
<input type="text" name="2">
<button onclick="validateForm()">
</form>
<script>
function validateForm() {
// Validate rules here
document.forms['my-form'].submit();
}
</script>
非常直截了当。然后将数据发送到服务器,检查csrf令牌,然后将输入保存到数据库中。我试图理解为什么表单不会一直提交。有时当我单击提交按钮时,页面只是重新加载,并且当其他时候将表单保存到数据库并且我被重定向到下一页时,数据就会消失。
据我所知,我相信这可能与到期有关。如果启动表单并将其保留太久,则不会提交。我每次提交表格时都会提交。然而,有时当我离开表单太久时,它会提交。
您可以想象,由于输入的数据有时会丢失,因此会有多么令人沮丧。这个问题可能是什么原因?感谢。
答案 0 :(得分:0)
解决方案:
将type="button"
属性添加到<button>
。这将停止表单处理您的按钮,如submit
按钮。
说明:
“有时它有效”通常意味着你有竞争条件。您的竞争条件介于JavaScript和默认浏览器行为之间。 type
的默认<button>
属性为submit
。示例代码中的表单没有action
或method
属性。对于这些条件,表单的默认行为是在单击按钮时为当前URL执行GET
。按钮单击也将运行您的JavaScript。但是,根据默认行为重新加载页面的速度(或验证速度有多慢),您的javascript submit
可能会受到影响,也可能不受影响。
答案 1 :(得分:0)
从我的角度来看,您正在使用CSRF令牌。 CSRF令牌具有基于您使用的框架/ CMS的到期时间。这几乎是可配置的。
现在发生的情况是,当CSRF令牌到期时,服务器拒绝输入。这个可能适合您。要检查这一点,请保持表单打开并在很长一段时间后提交,如果同一问题重复出现,请使用以下解决方案,否则这不是您的情况。
一个简单的解决方案是增加CSRF令牌的到期时间并检查现象是否重复。