2012-07-16 1 views
0

POST 메서드 제출을받는 작은 Perl 페이지를 작성하고 있습니다. 한 사람/컴퓨터가 양식을 여러 번 제출하는 것을 방지 할 수 있기를 원합니다. 반복적 인 제출으로 홍수를 피하십시오. 그러나 Perl CGI에서이를 수행하는 방법에 대한 예제 나 설명을 찾을 수 없습니다. 몇 가지 예를 알려 주시거나 지시 해 주실 수 있습니까? 첫 번째 제출 후 HTTP 헤더 (토큰?)의 일부 데이터를 사용하거나 쿠키를 심을 수는 있지만 어떻게해야할지 모르겠다.Perl (CGI)을 사용하여 사용자가 양식을 두 번 제출하지 마십시오

도움이 될 것입니다. 감사합니다. -Arseny

답변

1

사용자가 버튼을 여러 번 클릭하지 않도록하는 가장 간단한 방법은 페이지에 자바 스크립트를 추가하는 것입니다. 그것은 스크립트 나 예를 들어 F5을 누르면 작동하지 않습니다.

<input type="submit" name="go" id="go" value="go" onclick="this.disabled='disabled'"/> 

는 또한 사용자와 타임 스탬프의 IP 주소를 보유하고있는 서버의 로그 파일/데이터베이스를 작성하고, 자신이 이미 제출 여부를 확인할 수 있습니다. 쿠키를 설정하고 확인하는 것 외에는 그렇게하는 것이 좋습니다.

쿠키의 경우 CGI doc의 cookies을 참조하십시오. 간단한 예 :

use strict; use warnings; 
use CGI; 

my $q = new CGI; 

my $submitted = 0; 
if ($q->cookie('submitted ')) { 
    $submitted = 1; 
} 
# Here you could place the file/db check to also set $voted 
if ($submitted) { 
    print $q->header('text/plain'); 
    print "You have already submitted!"; 
} else { 
    # Do stuff with the form, like $q->param('foo')... 
    # Once you're done, place the cookie 
    print $q->header(
    -type => 'text/plain', 
    -cookie => $q->cookie(
     -name => 'submitted', 
     -value => 1, 
     -expires => '+1y', 
)); 
} 
+0

고맙습니다! 내 CGI에서 제출자의 IP를 어디에서 얻을 수 있습니까? CGI 유형 객체의 어느 부분에 있을까요? –

+1

'$ q-> remote_addr()'- [FETCHING ENVIRONMENT VARIABLES] (http://search.cpan.org/dist/CGI/lib/CGI.pm#FETCHING_ENVIRONMENT_VARIABLES)를 참조하십시오. – simbabque