JAVAWeb_利用Session防止表单重复提交:10-客户端防表单重复提交和服务器端session防表单重复提交
2013-02-19 22:51
806 查看
利用Session防止表单重复提交:
10-客户端防表单重复提交和服务器端session防表单重复提交
假如没有防止提交表单,那么,提交的数据就可以通过刷新再次注册
结果:
向数据库中注入用户。。。。。。。。
向数据库中注入用户。。。。。。。。
向数据库中注入用户。。。。。。。。
向数据库中注入用户。。。。。。。。
向数据库中注入用户。。。。。。。。
DoFormServlet.java
form.jsp
1
10-客户端防表单重复提交和服务器端session防表单重复提交
假如没有防止提交表单,那么,提交的数据就可以通过刷新再次注册
<form action="DoFormServlet"> 用户名:<input type="text" name="username"/> <input type="submit" value="提交"> </form>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); try {//模拟网络延时,此时狂刷浏览器,或点击提交 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("向数据库中注入用户。。。。。。。。"); }
结果:
向数据库中注入用户。。。。。。。。
向数据库中注入用户。。。。。。。。
向数据库中注入用户。。。。。。。。
向数据库中注入用户。。。。。。。。
向数据库中注入用户。。。。。。。。
解决方案一:前台验证阻止
<script> function dosubmit(){ var input = document.getElementById("submit"); input.disabled = 'disabled'; return true; } </script> <form action="DoFormServlet" onsubmit="return dosubmit();"> 用户名:<input type="text" name="username"/> <input type="submit" id="submit" value="提交" > </form>
<script> var iscommitted = false; function dosubmit(){ if(!iscommitted){ iscommitted = true; return true; }else{ return false; } } } </script> <form action="DoFormServlet" onsubmit="return dosubmit();"> 用户名:<input type="text" name="username"/> <input type="submit" id="submit" value="提交" > </form>
在后台验证:通过token【模仿struts的token标签】
FormServlet.javaimport java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import sun.misc.BASE64Encoder; /** * Servlet implementation class FormServlet */ @WebServlet("/FormServlet") public class FormServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public FormServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //产生随机数(表单号) TokenProcessor tp = TokenProcessor.getInstance(); String token = tp.generateToken(); request.getSession().setAttribute("token", token); request.getRequestDispatcher("/form.jsp").forward(request,response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } class TokenProcessor{ /* * 1,把构造方法私有 * 2,自己创建一个 * 3,对外暴露一个方法,允许获取上面创建的对象 * * */ private TokenProcessor() { } private static final TokenProcessor instance = new TokenProcessor(); public static TokenProcessor getInstance(){ return instance; } public String generateToken(){ String token = System.currentTimeMillis() + new Random().nextInt() + ""; MessageDigest md; try { md = MessageDigest.getInstance("md5"); byte[] md5 = md.digest(token.getBytes()); //base64编码 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(md5); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } }
DoFormServlet.java
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class DoFormServlet */ @WebServlet("/DoFormServlet") public class DoFormServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public DoFormServlet() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); //try { // Thread.sleep(3000); //} catch (InterruptedException e) { // e.printStackTrace(); //} //System.out.println("向数据库中注入用户。。。。。。。。"); boolean b = isTokenValid(request); if(!b){ System.out.println("请不要重复提交"); return; } request.getSession().removeAttribute("token"); System.out.println("向数据库中注入用户。。。。。。。。"); } private boolean isTokenValid(HttpServletRequest request) { String client_token = request.getParameter("token"); if(client_token == null){ return false; } String server_token = (String) request.getSession().getAttribute("token"); if(server_token == null){ return false; } if(!client_token.equals(server_token)){//token不等则为重复提价 return false; } return true; } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
form.jsp
<form action="DoFormServlet" method="post"> 用户名:<input type="text" name="username"/> <input type="hidden" name="token" value="${token }"/> <input type="submit" id="submit" value="提交" > </form>
1
相关文章推荐
- JAVAWeb_利用Session防止表单重复提交:10-客户端防表单重复提交和服务器端session防表单重复提交
- 10-客户端防表单重复提交和服务器端session防表单重复提交
- JavaWeb_session_应用_防止注册表单页面的重复提交
- JavaWeb_session_应用_防止注册表单页面的重复提交
- java web 学习十三(使用session防止表单重复提交)
- JavaWeb之——使用Session防止表单重复提交(插曲)
- JavaWeb---总结(十三)使用Session防止表单重复提交
- JAVA_WEB之Session防止表单重复提交
- JavaWeb ——使用Session防止表单重复提交
- java web 防止表单重复提交解决方案
- 客户端防表单重复提交和服务器端session防表单重复提交
- [Java拾遗五]使用Session防止表单重复提交
- 利用Session防止表单重复提交
- 利用Session防止表单重复提交问题
- 利用Session防止表单重复提交
- 利用Session防止表单重复提交(token)
- 客户端防表单重复提交和服务器端session防表单重复提交
- 利用Session防止表单重复提交(token)
- JSP学习之------>客户端防表单重复提交和服务器端session防表单重复提交
- 利用session防止表单重复提交