2017-09-12 4 views
4

여기에 약간의 상황이 있습니다. 내 조직에서는 재고 관리 시스템을 설계하고 JSP 페이지와 서블릿을 기반으로하는 웹 애플리케이션을 처리합니다.뒤로 버튼을 누른 후 양식 다시 제출하지 못하게하십시오.

특정 문제를 해결하도록 요청 받았습니다. 주식 세부 사항이있는 HTML 양식 테이블이있는 JSP 페이지가 있습니다. 사용자가 세부 정보를 직접 입력하고 양식을 제출하면 데이터베이스에 재고 정보가 업데이트되어 제대로 작동합니다.

문제는 : 사용자가 브라우저의 뒤로 버튼을 누르면 사용자가 세부 정보를 제출 한 이전 페이지로 이동할 수 있습니다. 사용자가 제출하면 데이터가 데이터베이스에 한 번 더 저장됩니다.이 동작을 방지해야합니다. (뭔가 잘못되어 페이지를 새로 고침합니다.)

브라우저 캐시를 지우십시오. 코드가 정상적으로 작동합니다. 예상 한 결과는 아닙니다.

불행히도 회사 규정으로 인해 코드를 공유 할 수 없습니다. 필요한 것은이 동작이나 해결 방법을 막는 데 도움이됩니다. 사전에

감사합니다 ..

+1

를 사용할 수 있지만 그렇지 않은 회사의 특정 만들기 위해 코드를 일반화 할 수있는 방법은 무엇입니까? – Michael

+0

미안하지만 미시적이지만 복잡한 코드이고 원하는 부분이 무엇인지 알 수 없습니다. 답장을 보내 주셔서 감사합니다. –

답변

4

숨겨진 속성을 사용하여 javascript 기능을 사용하여 웹 페이지를 다시로드 할 수 있습니다. 사용자가 숨겨진 속성의 값에 따라 뒤로 버튼을 누르면 캐시 된 페이지를로드하지 않고 페이지가 다시로드됩니다.

캐시 지우기 접근 방식이 정확합니다. 이것과 함께이 접근법을 사용할 수 있습니다.이 방법의

<input type="hidden" id="refreshed" value="no"> 
    <script type="text/javascript"> 

      onload=function(){ 
       var e=document.getElementById("refreshed"); 
       if(e.value=="no")e.value="yes"; 
       else{e.value="no";location.reload();} 
      } 

    </script> 

한 가지 단점은 클라이언트의 브라우저가 비활성화 JS가있는 경우,이 작동한다 work.Otherwise 않을 것입니다.

+0

답변 해 주셔서 감사합니다. 밖으로 시도하고 알려 드리겠습니다 :) –

+0

제안을 시도하고 작동하게 만들었습니다. 감사! –

2

당신은 후 리디렉션-가져 패턴을 사용해야합니다 https://en.m.wikipedia.org/wiki/Post/Redirect/Get을.

실제로는 method="post" 인 표준 HTML 양식을 사용할 때는 해당 패턴을 사용해야합니다. 실제로 AJAX가 게시 한 양식에는 사용할 수 없지만 실제로는 다른 솔루션 일 수 있지만 더 많은 작업과 아키텍처 변경이 필요합니다.

+0

제안 및 리소스를 제공해 주셔서 감사합니다. 그러나 나는 이미 존재하는 코드에 대한 극적인 변화를 허용하지 않을까 두렵다. 어쨌든 다른 사람이 해결하지 못하면 상사에게 설명하려고 노력할 것입니다. –

+0

사실, 그것은 꽤 솔직해야합니다. 잘못된 입력의 경우 아무 것도 변경하지 않습니다. 사용자는 렌더링 된 오류 메시지가있는 페이지를 보게되며 폼을 다시 제출하면 동일한 유효성 검사 오류 만 표시됩니다. 그러나 성공적으로 제출하려면 페이지를 렌더링하는 대신 리디렉션을 수행하십시오. 확인 페이지로 리디렉션하는 것이 좋습니다. 따라서 사용자는 자신의 행동이 실제로 성공했음을 알 수 있지만 (아마도 귀하의 경우 추가 작업 일 수도 있음), 단순히 같은 페이지로 리디렉션 할 수도 있습니다. – szczepanpp

3

사용자가 브라우저의 뒤로 버튼을 누르면 사용자가 세부 정보를 제출 한 이전 페이지로 이동할 수 있습니다. 사용자가 을 제출하면 데이터가 데이터베이스에 한 번 더 저장됩니다.

어떻게 설명했는지에 따라 doGet 요청을 기반으로합니다. 즉, URL을 방문 할 때마다 추가 된 매개 변수와 함께 요청을 보냅니다. 당신이 게시물 방법에 양식을 전환 과의 doPost에 서블릿을 전환 경우 사람으로

이미 언급 한, 당신은 더 이상이 문제가되지 않습니다.

또는 자바 스크립트 솔루션으로이를 피할 수 있습니다. 다음은 몇 가지 옵션입니다.

  • 사용자가 clicked the back button인지 확인하고 true 인 경우 양식을 사용 중지 할 수 있습니다.

  • 또 다른 방법은 페이지로드시 확인하는 storing a cookie입니다. 존재하는 경우 양식을 사용 중지 할 수 있습니다.

+0

Android 6에서 Firefox의 'POST'폼에서 나에게도 똑같은 일이 발생합니다. 양식이있는 페이지로 돌아 오면 이미 제출되어 다시 제출할 수 있습니다. – szczepanpp

+1

감사합니다. 조나단 나는 당신의 제안을 시도하고 결과를 알려 드릴 것입니다. –

1

당신은이 코드 당신이 정확한 코드를 공유 할 수 없습니다 이해도

$(document).ready(function() { 
    function disableBack() { window.history.forward() } 

    window.onload = disableBack(); 
    window.onpageshow = function(evt) { if (evt.persisted) disableBack() } 
}); 
관련 문제