session防止表单重复提交

(1)包含有Form表单得页面必须通过一个服务器程序动态生成,服务器程序为每次产生得页面中的form表单都分配一个唯一得随机标识号,并在form表单得一个隐藏域 保存

(2)当用户提交form得时候,负责接受这一请求得服务器程序比较form表单隐藏字段中的标识号与存贮在session中的是否相同,当下列情情况时候,服务器程序将忽略提交请求:

a.当前用户session不存在表单标识
b.用户提交得表单数据并没有标识号字段
c.存贮在当前用户的session中得标识号与表单数据中的不同

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <title>RepeateForm.html</title>
  5. <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  6. <metahttp-equiv="description"content="this is my page">
  7. <metahttp-equiv="content-type"content="text/html; charset=UTF-8">
  8. <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
  9. <scripttype="text/javascript">
  10. var iscommitted = false;
  11. function checkPost(){
  12. if(!iscommitted){
  13. document.getElementById("sub").disabled =turn;
  14. iscimmitted = turn;
  15. return trun;
  16. }else{
  17. // alert("不能重复提交表单!");
  18. return false;
  19. }
  20. }
  21. </script>
  22. </head>
  23. <body>
  24. <formaction="/BookHistory/serlevt/RepeateFormServlet"method="poss"onsubmit="return checkPost()">
  25. 用户名:<inputtype="text"name="username"/><br>
  26. <inputtype="submit"value="提交"id="sub"/>
  27. </form>
  28. </body>
  29. </html>
  30. package com.hbsi.servlet;
  31. import java.io.IOException;
  32. import java.io.PrintWriter;
  33. import javax.servlet.ServletException;
  34. import javax.servlet.http.HttpServlet;
  35. import javax.servlet.http.HttpServletRequest;
  36. import javax.servlet.http.HttpServletResponse;
  37. public class FormDealServlet extends HttpServlet {
  38. public void doGet(HttpServletRequest request, HttpServletResponse response)
  39. throws ServletException, IOException {
  40. /* String client_token = request.getParameter("token");
  41. if(client_token==null){
  42. return false;*/
  43. boolean b = isTokenValidate(request);
  44. if(!b){
  45. System.out.print("请不要重复提交");
  46. return;
  47. }
  48. request.getSession().removeAttribute("token");
  49. System.out.print("项数据库注册用户信息。。。");
  50. }
  51. private boolean isTokenValidate(HttpServletRequest request){
  52. String client_token = request.getParameter("token");
  53. if(client_token==null){
  54. return false;
  55. }
  56. String server_token=(String) request.getSession().getAttribute("token");
  57. if(server_token==null){
  58. return false;
  59. }
  60. if(!client_token.equals(server_token)){
  61. return false;
  62. }
  63. return true;
  64. }
  65. public void doPost(HttpServletRequest request, HttpServletResponse response)
  66. throws ServletException, IOException {
  67. }
  68. }
  69. package com.hbsi.servlet;
  70. import java.io.IOException;
  71. import java.io.PrintWriter;
  72. import javax.servlet.ServletException;
  73. import javax.servlet.http.HttpServlet;
  74. import javax.servlet.http.HttpServletRequest;
  75. import javax.servlet.http.HttpServletResponse;
  76. public class ForeGenerateServlet extends HttpServlet {
  77. public void doGet(HttpServletRequest request, HttpServletResponse response)
  78. throws ServletException, IOException {
  79. response.setContentType("text/heml;charset=UTF-8");
  80. PrintWriter out = response.getWriter();
  81. //产生表单号
  82. TokenProcessor tp = TokenProcessor.getInstance();
  83. String token= tp.generateToken();
  84. request.getSession().setAttribute("token", token);
  85. out.print("<formaction='/BookHistory/servlet/FormDealServlet'method='post'/>");
  86. out.print("<inputtype='hidden'name='token'value='"+token+"'/>");
  87. out.print("用户名:<inputtype='text'name='username'/>");
  88. out.print("<inputtype='submit'value='提交'/>");
  89. out.print("</form>");
  90. }
  91. public void doPost(HttpServletRequest request, HttpServletResponse response)
  92. throws ServletException, IOException {
  93. }
  94. }
  95. package com.hbsi.servlet;
  96. import java.security.MessageDigest;
  97. import java.security.NoSuchAlgorithmException;
  98. import java.util.Random;
  99. import sun.misc.BASE64Encoder;
  100. public class TokenProcessor {
  101. private TokenProcessor(){
  102. }
  103. private static final TokenProcessor instance=new TokenProcessor();
  104. public static TokenProcessor getInstance(){
  105. return instance;
  106. }
  107. public String generateToken(){
  108. int i= new Random().nextInt();
  109. String token= System.currentTimeMillis()+i+"";
  110. try {
  111. MessageDigest md=MessageDigest.getInstance("md5");
  112. byte[]md5 = md.digest(token.getBytes());
  113. //base64编码
  114. BASE64Encoder encoder = new BASE64Encoder();
  115. encoder.encode(md5);
  116. //return new String(md5);
  117. } catch (NoSuchAlgorithmException e) {
  118. // TODO Auto-generated catch block
  119. //e.printStackTrace();
  120. throw new RuntimeException(e);
  121. }
  122. return null;
  123. }
  124. }
  125. package com.hbsi.servlet;
  126. import java.io.IOException;
  127. import java.io.PrintWriter;
  128. import javax.servlet.ServletException;
  129. import javax.servlet.http.HttpServlet;
  130. import javax.servlet.http.HttpServletRequest;
  131. import javax.servlet.http.HttpServletResponse;
  132. public class RepeateFormServlet extends HttpServlet {
  133. public void doGet(HttpServletRequest request, HttpServletResponse response)
  134. throws ServletException, IOException {
  135. response.setContentType("text/html;charset=UTF-8");
  136. PrintWriter out = response.getWriter();
  137. String username = request.getParameter("username");
  138. try {
  139. Thread.sleep(5*1000);
  140. } catch (InterruptedException e) {
  141. // TODO Auto-generated catch block
  142. e.printStackTrace();
  143. }
  144. out.print("以处理你的信息");
  145. System.out.println("向数据库注册信息……");
  146. }
  147. public void doPost(HttpServletRequest request, HttpServletResponse response)
  148. throws ServletException, IOException {
  149. doGet(request,response);
  150. }
  151. }
posted @ 2012-11-07 11:37  温诗袀  阅读(154)  评论(0编辑  收藏  举报