客户端服务端防止用户重复提交表单
一、什么是表單重復提交?
當網絡有延遲時,用戶提交的表單等數據還沒有完成此次提交,但用戶又多次點擊提交,造成用戶數據在數據庫或存儲中被提交多次。
利用線程延遲,簡單模擬重復提交。
表單頁面為form.html
[html] view plain copy
form.html
用戶名 :
處理提交請求的servlet為DoFormServlet.java
[java] view plain copy
package SessionDemo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DoFormServlet extends HttpServlet
{
}
在瀏覽器中加載form.html
當用戶反復點擊“提交”時,就造成了重復提交。
二、解決方法一:利用javascript阻止
其他不變,將form.html修改為
[html] view plain copy
form.html
var isCommitted = false;
function dosubmit()
{
if(!isCommitted)
{
isCommitted=true;
return true;
}
else
{
return false;
}
}
用戶名 :
這樣在瀏覽器中加載form.html后,點擊“提交”,終端中只會輸出一次”向數據庫中注冊數據。”,表明成功阻止表單反復提交。
以上form.html可以進一步優化,當用戶點擊“提交”后,“提交”按鈕應該變為灰色不可用。
[html] view plain copy
form.html
function dosubmit()
{
var input = document.getElementById("submit");
input.disabled = 'disabled';
return true;
}
用戶名 :
利用javascript的方法不能完全防止用戶惡意重復提交,例如:用戶可以將form.html保存后修改,還可以在點擊“提交”后重復刷新頁面,從而實現反復提交。
三、解決方法二:利用服務器端Session防止表單重復提交。
其中FormServlet.java為
[java] view plain copy
package SessionDemo;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;
public class FormServlet extends HttpServlet
{
}
//設計為單例模式
class TokenProcessor
{
private TokenProcessor(){};
private static final TokenProcessor instance = new TokenProcessor();
}
添加form.jsp
[plain] view plain copy
<%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8”%>
用戶名
將DoFormServlet.java修改為
[java] view plain copy
package SessionDemo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DoFormServlet extends HttpServlet
{
}
再瀏覽器中加載FormServlet
點擊“提交”后跳轉
終端顯示用戶提交
這時即使用戶點擊“刷新”,也不能實現重復提交。
總結
以上是生活随笔為你收集整理的客户端服务端防止用户重复提交表单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat6项目移到Tomcat7 提
- 下一篇: 多线程的三种实现方法