2차 제출 방지(중복 제출)

@ 요청할 때마다 Token (일반적으로 시간 스탬프) 을 만들어서session에 저장하고 Hidden으로 제출합니다. servlet에서 받은 Token과session의 일치 여부를 판단해서 중복 제출 여부를 판단합니다. 그렇지 않으면 다시session에 저장된 Token을 만들어서 원래의 Token을 덮어씁니다.
@ 사용자가 반복 요청 servlet을 되돌려주거나 새로 고칠 때 servlet은token이 일치하는지 판단합니다. 요청자가 새로운token을 생성하지 않았기 때문에 servlet에서 새로운token과 일치하지 않습니다. 중복 제출이라고 생각됩니다.
@ 사용자가 요청 페이지를 새로 고침하면 요청 페이지에서 Token이 생성됩니다. 이 때 새로운token은 servlet에서 생성한token을 덮어씁니다. 이때token은 일치하며 새로운 요청이라고 생각합니다.
요청된 jsp 페이지 코드:
 @
<body>
    <%
           long token=System.currentTimeMillis();    //      token
    		session.setAttribute("token",token);    
           
    %>
    <form  action="isRepeat" method="post">
        <input type="text"  name="username"/>
        <input type="text"  name="password"/>
        <input type="hidden" value="<%=token %>" name="token"/>   <!--   hidden   -->
        <input type="submit" value="  "/>
    </form>
</body>
서브렛 페이지 코드:
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		 req.setCharacterEncoding("utf-8");
		 resp.setCharacterEncoding("utf-8");
		 resp.setContentType("text/html,charset=utf-8");
		 String username=req.getParameter("username");
		 String password=req.getParameter("password");
		 long token=Long.parseLong(req.getParameter("token"));
		 long tokenInSession=Long.parseLong(req.getSession().getAttribute("token")+"");
		 if(token==tokenInSession){
			resp.getWriter().println("ok ");
                        //        ,     token 
                        req.getSession().setAttribute("token", System.currentTimeMillis());
			 
		 }
		 else
		 {
			 
			resp.getWriter().println("do not repeat submit"); 
		 }
	}

 
 

좋은 웹페이지 즐겨찾기