2015-11-16 1 views
0

J'essaie de mettre en œuvre un système d'autorisation utilisateur de base en utilisant perl et CGI. Le navigateur (firefox & safari) ne réagit pas à la redirection CGI (en cas de connexion réussie à une nouvelle page) ou même à une simple impression HTML après avoir inclus jQuery 1.11.13.min.js dans l'en-tête de la page de connexion HTML . La zone de contenu du navigateur et la zone de texte de l'URL restent les mêmes que les scripts CGI n'ont jamais été exécutés. Mais je sais que les scripts ont été exécutés.Le navigateur ne réagit pas/met à jour vers perl CGI rediriger/imprimer html après avoir inclus jquery-1.11.3.min.js

Voici un résumé du système:
L'utilisateur est d'abord présenté avec une page de connexion HTML (login_page.html) qui contient un formulaire de connexion de base avec des champs « nom d'utilisateur » et « mot de passe », l'action du formulaire est script cgi (verify.cgi) appelé en utilisant POST.

Ce script vérifie si les informations d'identification sont OK et soit réoriente à un nouveau script CGI (welcome.cgi) qui imprime un message de bienvenue de base en HTML ou tout simplement imprime un message html de base de l'échec là-bas et puis (tous les trois fichiers sont inclus plus bas sur ce post). Toutefois, un problème est survenu après la redirection vers la page d'accueil (CGI). Le script welcome.cgi est appelé avec succès car je l'ai fait imprimer un message dans un fichier sur le serveur. MAIS la case d'adresse-url du navigateur (firefox 41.0.2 et safari 6.2.4) ne se met pas à jour, l'URL http://..../verify.cgi y reste. En outre, le navigateur affiche la page de connexion html et ne met pas à jour sa zone de contenu vers le message de bienvenue ou de connexion échoué html édité par les scripts verify.cgi/welcome.cgi.

Le problème apparaît après l'inclusion du fichier jQuery js standard (http://code.jquery.com/jquery-1.11.3.min.js) dans l'en-tête de ma page de connexion (en html).

Quelqu'un peut-il m'aider à trouver ce que je fais de mal et comment y remédier?

Veuillez ne pas demander pourquoi je veux inclure jQuery. Et je préfère rester avec Perl que toute autre chose.

Commentaires généraux sur le code et le design accueillis.

Un grand merci

Voici les trois fichiers dans leur forme la plus simple:

  1. login_page.html
<!doctype html> 
<html> 
<head> 
<!-- this one creates a problem with CGI redirect --> 
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script> 

<!-- this one does not seem to create any problem --> 
<script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script> 

</head> 
<body> 
<form action="/bin/verify.cgi" method="post" name="login_form"> 
<input type="text" name="username" id="username"><br/> 
<input type="password" name="password" id="password"><br/> 
<input type="submit" value=" Log In " name="login_button"/> 
</form> 
</body> 
</html> 
  1. verify.cgi
#!/usr/bin/env perl 

use strict; 
use warnings; 
use CGI::Carp; 
use CGI::Session; 
use CGI; 

my $cgi = CGI->new; 

my $username = $cgi->param("username"); 
my $password = $cgi->param("password"); 

if(defined($username) && 
    defined($password) && 
    ($username eq 'test') && 
    ($password eq 'test') 
){ 
    # successful login 
    my $session = CGI::Session->new(
     "driver:File", 
     undef, 
     {Directory=>'/tmp'} 
    ); 
    my $sid = $session->id(); 
    $session->param('username', $username); 
    # setup the cookie to the session 
    my $cookie = $cgi->cookie(
     -name => 'CGISESSID', 
     -value => $sid 
    ); 
    $session->save_param(); 
    $session->flush(); 
    # move on to the next page and place the cookie in the headers 
    # the script in the -location is EXECUTED OK - so redirect works 
    # however browser does not update URL textbox nor its content page: 
    print $cgi->redirect(
      -cookie => $cookie, 
      -url => 'http://c3.myartsonline.com/bin/welcome.cgi' 
    ); 
    # even with this it does not work 
    # print $cgi->header() . "<html><body>welcome, login successful</body></html>"; 

} else { 
    # login failed 
    # this I can not see in the browser either 
    print $cgi->header() . '<html><body>login failed</body></html>'; 
} 
1; 
__END__ 
  1. welcome.cgi
#!/usr/bin/env perl 

use strict; 
use warnings; 
use CGI; 
use CGI::Session; 
my $cgi = CGI->new; 

my ($session, $username) = (undef) x 2; 

my $sid = $cgi->cookie('CGISESSID') || $cgi->param('CGISESSID') || undef; 
if(defined($sid)){ 
    $session = CGI::Session->new(undef, $sid, {Directory=>'/tmp'}); 
    if(defined($session)){ 
     $username = $session->param('username') 
    } 
} 
if(defined($username)){ 
    print $cgi->header() . "<html><body>welcome user '$username', login successful</body></html>"; 
    open(OUT, ">hello"); 
    print OUT "weclome\n"; 
    close(OUT); 
} else { 
    print $cgi->header() . "<html><body>please login first</body></html>"; 
} 
1; 
__END__ 
+1

Utilisez la méthode 'redirect' comme décrit dans la documentation de CGI.pm sous [Générer un en-tête de redirection] (http://perldoc.perl.org/CGI.html#GENERATING-A-REDIRECTION-HEADER). Vous pouvez voir comment les en-têtes diffèrent de votre méthode actuelle en s'exécutant sur la ligne de commande: comparer 'perl -MCGI -e'imprimer CGI-> new-> en-tête (-location =>" foo ") '' en perl -MCGI -e'print CGI-> new-> redirect ("foo") '' – ThisSuitIsBlackNot

+1

Aussi, si vous écrivez un nouveau code, je vous recommande d'utiliser autre chose que CGI.pm. Son utilisation est [officiellement déconseillée] (https://metacpan.org/pod/CGI#CGI.pm-HAS-BEEN-REMOVED-FROM-THE-PERL-CORE): "... CGI.pm n'est plus considéré bonne pratique pour le développement d'applications Web **, y compris ** le prototypage rapide et les scripts Web de petite taille Il existe des alternatives bien meilleures, plus propres, plus rapides, plus faciles, plus sûres, plus extensibles, plus extensibles et plus modernes disponibles à ce jour. être documenté avec [CGI :: Alternatives] (https://metacpan.org/pod/CGI::Alternatives). " – ThisSuitIsBlackNot

+0

A noté votre commentaire re: rediriger. Je sais à propos de CGI.pm obsol. mais y a-t-il une alternative? J'utilise HTML :: Templates pour toutes les sorties html mais CGI pour les cookies, les params etc. J'ai essayé la méthode que vous utilisez aussi (-> redirect). Le comportement du navigateur est le même. Notez que ce problème se termine même si toutes les redirections sont supprimées et que le script CGI génère un code HTML de base dans le navigateur. Le navigateur ne l'affiche pas du tout (par exemple, dans mon exemple, vérifiez le script lorsque le mot de passe est incorrect). Cela peut-il être lié à jQuery? si je commente l'include de jQuery, le navigateur réagit à la redirection comme prévu. – bliako

Répondre

0

Ajout

data-ajax="false"

à la définition de forme (par exemple, <form data-ajax="false" ....>) à l'intérieur du fichier login_page.html

résout le problème. La zone de texte et la zone de contenu url du navigateur sont désormais correctement mises à jour lors de l'exécution d'un CGI :: redirect().

Cela va-t-il casser quelque chose d'autre? Qui sait.