フォームの重複コミットの問題解決策


1.私たちのウェブ開発では、フォームの重複コミットの問題に遭遇することがよくあります.では、私たちの解決策は2つあります.1リダイレクト:response.sendrediect(); ②tokenの使用、すなわちマーキング
次にtokenの例を書きます:(tomcatで実行できます.)
1.JSPページ、3つ.
index.jsp

  
  
  
  
  1. <%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>

  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

  3. <html>

  4. <head>

  5. <title> </title>

  6. </head>

  7. <body>

  8. <h4></h4>

  9. <%

  10.    String token = (String)request.getAttribute("mytoken");

  11.        out.print(token);

  12.    %>

  13. <formaction="token.jspx?_m=pay"method="post">

  14. <inputtype="hidden"name="token"value="<%=token %>"/>

  15. <inputtype="text"name="money"/>

  16. <inputtype="submit"value=" "/>

  17. </form>

  18. </body>

  19. </html>


suc.jsp

  
  
  
  
  1. <%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>

  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

  3. <html>

  4. <head>

  5. <title> </title>

  6. </head>

  7. <body>

  8. <h2style="color:red;"> ! !</h2>

  9. </body>

  10. </html>


error.jsp

  
  
  
  
  1. <%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>

  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

  3. <html>

  4. <head>

  5. <title> </title>

  6. </head>

  7. <body>

  8. <h2> , !</h2>

  9. </body>

  10. </html>


2.com.hanchao.web.utilは私たちのキットです

  
  
  
  
  1. package com.hanchao.web.util;

  2. import java.util.UUID;

  3. import javax.servlet.http.HttpServletRequest;

  4. import javax.servlet.http.HttpSession;

  5. /**

  6. *

  7. * @author hanlw

  8. * 2012-07-09

  9. */

  10. publicclass TokenUtil {

  11. // , ,

  12. privatestaticfinal String TOKEN = "TOKEN";

  13. /**

  14.     * token

  15.     * @param request

  16.     * @return

  17.     */

  18. public String getToken(HttpServletRequest request) {

  19. //★UUID

  20. UUID uuid = UUID.randomUUID();

  21.        String token = uuid.toString();

  22.        HttpSession session = request.getSession();

  23.        session.setAttribute(TOKEN, token);

  24. return token;

  25.    }

  26. /**

  27.     * token

  28.     * @param request

  29.     * @param requestToken

  30.     * @return

  31.     */

  32. publicboolean validateToken(HttpServletRequest request,String requestToken) {

  33.        HttpSession session = request.getSession();

  34.        String sessionToken = (String) session.getAttribute(TOKEN);

  35. if(sessionToken != null &&

  36.           requestToken != null &&

  37.           sessionToken.equals(requestToken)) {

  38.            session.removeAttribute(TOKEN);

  39. returntrue;

  40.        } else {

  41. returnfalse;

  42.        }

  43.    }

  44. }


3.我々のservlet

  
  
  
  
  1. package com.hanchao.web.util;

  2. import java.io.IOException;

  3. import javax.servlet.ServletException;

  4. import javax.servlet.http.HttpServlet;

  5. import javax.servlet.http.HttpServletRequest;

  6. import javax.servlet.http.HttpServletResponse;

  7. publicclass TokenServlet extends HttpServlet {

  8. privatestaticfinallong serialVersionUID = 1L;

  9. publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

  10. throws ServletException, IOException {

  11.        String method = request.getParameter("_m");

  12. if("pay".equals(method)) {

  13.            pay(request,response);

  14.        } elseif("tosave".equals(method)) {

  15.            save(request,response);

  16.        }

  17.    }

  18. /**

  19.     * token

  20.     * @param request

  21.     * @param response

  22.     * @throws ServletException

  23.     * @throws IOException

  24.     */

  25. privatevoid save(HttpServletRequest request, HttpServletResponse response)  

  26. throws ServletException, IOException{

  27.        TokenUtil util = new TokenUtil();

  28.        String token = util.getToken(request);

  29.        request.setAttribute("mytoken", token);

  30.        request.getRequestDispatcher("index.jsp").forward(request, response);

  31.    }

  32. /**

  33.     *

  34.     * @param request

  35.     * @param response

  36.     * @throws ServletException

  37.     * @throws IOException

  38.     */

  39. privatevoid pay(HttpServletRequest request, HttpServletResponse response)

  40. throws ServletException, IOException{

  41.        String token = request.getParameter("token");

  42.        TokenUtil util = new TokenUtil();

  43. boolean result = util.validateToken(request, token);

  44. if(result) {

  45.            String money = request.getParameter("money");

  46.            System.out.println(" "+money+" ");

  47.            request.getRequestDispatcher("suc.jsp").forward(request, response);

  48.        } else {

  49.            request.getRequestDispatcher("error.jsp").forward(request, response);

  50.        }

  51.    }

  52. publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

  53. throws ServletException, IOException {

  54.        doGet(request,response);

  55.    }

  56. }


==================================================================
2013-06-21-add-han
昨日私たちのアーキテクチャとこの問題について話しました.今やっているプロジェクトが関連しているからです.彼は、分散型の大規模なインターネットプロジェクトでは、このようなtokenの方式は、高同時性の場合に問題が発生する可能性があると述べた.だから、redirectが一番安全なのもお勧めでしょう.ありがとう