양식의 반복 제출 : 한 번 완료되지 않음, 먼저 양식 페이지를 요청한 다음 양식 프로세스를 제출하여 데이터 제출을 완료하십시오.
근본 원인 : 전체적으로 수행하지 않으면 먼저 양식 페이지를 요청한 다음 양식 프로세스를 제출하십시오.
반복 제출 원인 :
참고 : 뒤로 넘어간 후 양식 페이지를 새로 고치고 다시 제출하십시오. 현재 제출을 반복하는 대신 새 요청이 전송됩니다. Firefox에서는 동일한 주소로 제출을 반복하는 작업이 유효하지 않습니다.
사례:
@webservlet ( "/trans") public class transferservlet는 httpservlet {private static final long serialversionuid = 1l; 보호 된 void service (httpservletrequest req, httpservletresponse resp) servletexception, ioexception {req.setcharacterencoding ( "utf-8"); resp.setContentType ( "text/html; charset = utf-8"); printwriter out = resp.getwriter (); 문자열 money = req.getParameter ( "money"); // 네트워크 지연 시뮬레이션 {thread.sleep (3000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "양도 금액 :"+money); out.print ( "양도 금액 :"+money); }}미친 지점에서는 JSP 페이지가 변경되지 않지만 백그라운드에서 인쇄물을 통해 볼 수 있으며 항상 출력하여 항상 실행되고 있음을 나타냅니다.
해결책:
보증을 제출하기 전에 먼저 양식 인터페이스를 요청해야합니다. 원리는 검증 코드와 동일합니다 .----- 토큰 메커니즘
처음으로 요청할 때 양식 인터페이스를 요청할 때 토큰을 만듭니다. 전송을 클릭하고 요청을 보낼 때이 토큰을 가져와 다음 인터페이스로 보내십시오. 서블릿에서 토큰을 확인하십시오. 이 토큰은 세션 중 하나이며 양식에 있습니다. 평등은 양식이 정확 하고이 세션의 토큰이 파괴됨을 의미합니다.
JSP 페이지의 코드
<% // 토큰 문자열 생성 토큰 = java.util.uuid.randomuuid (). tostring (); // 세션 중 하나가 존재 한 다음 판단 세션을 작성합니다. %> <h3> 전송 인터페이스 </h3> <form action = "/trans"method = "post"> <input type = "hidden"name = "token"value = "<%= token%>"/> 전송 금액 : <입력 유형 = "text"name = "money"min = "1"required/>> <br/> value = "송금" "송금" "vally"
Transferservlet의 코드
@webservlet ( "/trans") public class transferservlet는 httpservlet {private static final long serialversionuid = 1l; 보호 된 void service (httpservletrequest req, httpservletresponse resp) servletexception, ioexception {req.setcharacterencoding ( "utf-8"); resp.setContentType ( "text/html; charset = utf-8"); printwriter out = resp.getwriter (); // 문자열에서 토큰 값을 얻습니다. String token = req.getParameter ( "Token"); // 세션에서 토큰 값을 가져옵니다. sessionToken = (string) req.getSession (). getAttribute ( "token_in_session"); // 세션의 토큰은 (token.equals (sessionToken))이면 파괴 가능하기 때문에 세션의 토큰이 비어있을 수 있습니다. 문자열 money = req.getParameter ( "money"); System.out.println ( "송금 금액 :"+money); out.print ( "이체 금액 :"+money); // 마지막으로 세션에서 토큰을 파괴} // 토큰이 다른 경우 반복 제출이며 제출할 수 없음을 의미합니다}}그런 다음 JSP 파일의 Java 코드에 표시되지 않으려면 다른 서블릿에서 토큰을 생성하고 점프하십시오.
@webservlet ( "/송신") 공개 클래스 CopyOfTransferservlet는 httpservlet {private static final long serialversionuid = 1L; Protected Void Service (httpservletrequest req, httpservletreponse resp) servletexception, ioexception {// 토큰을 생성하고 jsp string token = uuid.randomuuid (). toString (); System.out.println (토큰); req.getSession (). setAttribute ( "token_in_session", token); req.setattribute ( "토큰", 토큰); req.getRequestDispatcher ( "/views/reportSubmit/uppl.jsp"). Forward (req, resp); }}이것이 JSP 파일의 모습입니다
<H3> 전송 인터페이스 </h3> <form action = "/trans"method = "post"> <input type = "hidden"name = "token"value = "$ {token}"/> 전송 금액 : <입력 유형 = "text"name = "money"min = "1"요구/> <br/> <value = "value"위의 것보다 훨씬 깨끗하고 깔끔하지만 다른 장소에서 사용해야하는 경우 토큰을 만들고 토큰을 확인하고 토큰을 삭제해야하므로 도구 클래스를 만들기 위해 추출해야하기 때문에 여전히 기분이 좋지 않습니다.
Tokenutil.java
// 토큰 도구 클래스 // 토큰 생성 // 토큰 확인 // 토큰 공개 클래스 토큰 토큰 누틸 {개인 최종 정적 문자열 token_in_session = "token_in_session"; public static void savatoken (httpservletrequest req) {string token = uuid.randomuuid (). toString (); System.out.println (토큰); req.getSession (). setAttribute (token_in_session, token); req.setattribute ( "토큰", 토큰); } public static boolean validAteToken (httpservletrequest req, string tokeninrequest) {// sessionstring sessionToken = (string) req.getSession (). getAttribute (token_in_session); if (tokeninrequest.equals (sessionToken)) {req.getSession (). removeAttribute (token_in_session); 진실을 반환하십시오. } false를 반환합니다. }}이것은 괜찮습니다. 사용자는이 도구 클래스를 호출하면됩니다. 토큰 생성과 같은 일련의 작업을 작성할 필요가 없습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.