페이지 1에는 HTML 양식이 있습니다. 2 페이지-제출 된 데이터를 처리하는 코드.
1 페이지의 양식이 제출됩니다. 브라우저가 2 페이지로 리디렉션됩니다. 2 페이지는 제출 된 데이터를 처리합니다.
이 시점에서 페이지 2가 새로 고쳐지면 “양식 재 제출 확인”경고가 나타납니다.
이를 방지 할 수 있습니까?
답변
사람들이 여기에서 사용하는 두 가지 접근 방식이 있습니다.
방법 1 : AJAX + 리디렉션 사용
이렇게하면 JQuery 또는 Page2와 유사한 것을 사용하여 백그라운드에서 양식을 게시하는 반면 사용자는 여전히 page1이 표시된 것을 볼 수 있습니다. 게시에 성공하면 브라우저를 Page2로 리디렉션합니다.
방법 2 : 게시 + 자신에게 리디렉션
이것은 포럼에서 일반적인 기술입니다. 페이지 1의 양식은 페이지 2에 데이터를 게시하고, 페이지 2는 데이터를 처리하고 필요한 작업을 수행 한 다음 자체적으로 HTTP 리디렉션을 수행합니다. 이렇게하면 브라우저가 기억하는 마지막 “작업”은 page2의 간단한 GET이므로 F5시 양식이 다시 제출되지 않습니다.
답변
PRG-Post / Redirect / Get 패턴을 사용해야 하며 방금 PRG의 P를 구현했습니다. 리디렉션 해야합니다 . (지금은 리디렉션이 전혀 필요하지 않습니다. 참조 하십시오 )
PRG는 양식 제출 (Post Request 1)-> Redirect-> Get (Request 2)를 의미하는 일부 중복 양식 제출을 방지하는 웹 개발 디자인 패턴입니다.
Under the hood
리디렉션 상태 코드 -HTTP 302를 사용하는 HTTP 1.0 또는 HTTP 303을 사용하는 HTTP 1.1
리디렉션 상태 코드가있는 HTTP 응답은 위치 헤더 필드에 URL을 추가로 제공합니다. 사용자 에이전트 (예 : 웹 브라우저)는이 코드가있는 응답에 의해 초대되어 위치 필드에 지정된 새 URL에 대해 동일한 두 번째 요청을합니다.
리디렉션 상태 코드는이 상황에서 웹 사용자의 브라우저가 초기 HTTP POST 요청을 다시 제출하지 않고도 서버 응답을 안전하게 새로 고칠 수 있도록하는 것입니다.
Double Submit Problem
Post/Redirect/Get Solution
답변
직접적으로 할 수 없습니다. 그것은 좋은 일입니다. 브라우저의 경고는 이유가 있습니다. 이 스레드는 귀하의 질문에 답할 것입니다.
뒤로 버튼이 POST 확인 경고를 표시하지 않도록 방지
제안 된 두 가지 주요 해결 방법은 PRG 패턴과 AJAX 제출 후 스크립팅 재배치였습니다.
메서드가 POST 제출 메서드가 아닌 GET을 허용하는 경우 문제가 해결되고 규칙에 더 적합합니다. 이러한 솔루션은 POST 데이터를 원하거나 필요로한다는 가정하에 제공됩니다.
답변
동일한 양식이 두 번 제출되지 않도록 100 % 확신 할 수있는 유일한 방법은 발행하는 각 양식에 고유 식별자를 포함하고 서버에 제출 된 양식을 추적하는 것입니다. 함정은 사용자가 양식이 있던 페이지로 백업하고 새 데이터를 입력하면 동일한 양식이 작동하지 않는다는 것입니다.
답변
답변에는 두 부분이 있습니다.
-
중복 게시물이 서버 측의 데이터를 엉망으로 만들지 않도록하십시오. 이렇게하려면 후속 요청 서버 측을 거부 할 수 있도록 게시물에 고유 식별자를 포함합니다. 이 패턴은 을 메시징 용어로 Idempotent Receiver 합니다.
-
사용자가 둘 다에 의한 중복 제출 가능성으로 인해 방해받지 않도록하십시오.
- POST 후 GET으로 리디렉션 (POST 리디렉션 GET 패턴)
- 자바 스크립트를 사용하여 버튼 비활성화
2 미만으로 수행하는 작업은 중복 제출을 완전히 방지하지 않습니다. 사람들은 매우 빠르게 클릭 할 수 있으며 해커는 어쨌든 게시 할 수 있습니다. 중복이 없는지 절대적으로 확인하려면 항상 1이 필요합니다.
답변
POST 데이터로 페이지를 새로 고치면 브라우저가 다시 제출을 확인합니다. GET 데이터를 사용하는 경우 메시지가 표시되지 않습니다. 제출을 저장 한 후 데이터가없는 세 번째 페이지로 리디렉션되는 두 번째 페이지를 가질 수도 있습니다.
답변
아무도이 속임수를 언급하지 않았다는 것을 알았습니다.
리디렉션 없이도 새로 고칠 때 양식 확인을 방지 할 수 있습니다.
기본적으로 양식 코드는 다음과 같습니다.
<form method="post" action="test.php">
지금, 그것을
<form method="post" action="test.php?nonsense=1">
당신은 마법을 보게 될 것입니다.
URL에 GET 메서드 (쿼리 문자열)를 가져 오면 브라우저가 확인 경고 팝업을 트리거하지 않기 때문이라고 생각합니다.