cookie wieder
Frey
- perl
Hi.
Bin wieder zurueck vom Urlaub und sehe das mein letzter beitrag schon archiviert wurde und das im september??? naja egal....
Ich hoffe vielmals das ihr mir noch eine chanche gebt und mir nochmal helft.
ich habe den letzten Thread mal rausgesucht (ich hoffe ich darf ihn hier reinschreiben??) http://forum.de.selfhtml.org/archiv/2008/9/t177472/
Wer nicht reinschauen moechte: es ging um einen loginbereich. Erst wenn die richtigen Daten eingegeben werden soll ein cookie verschickt werden und trotz euerer wirklich zahlreichen antworten bin ich noch nicht weiter oder schlauer ;=(
ich dachte mir ich poste jetzt einfach mal meinen code damit ihr genauer wisst wo ich gerade bin und ich denke so koennte man mir besser helfen. Ich habe uebrigends die unwichtigeren sachen rausgeloescht weil es sonst zu viel wird also zum beispiel die pruefung ob der user in der datenbank ist und ob das passwort stimmt usw hier also der code:
#!/usr/bin/perl
use strict;
use CGI;
my $login = new CGI;
my $username = $login->param("username");
my $passwort = $login->param("passwort");
print "Content-Type: text/html\n\n";
print "<html><head></head><body>"
print "Bitte loggen Sie sich ein:";
print "<form action="login.pl">";
print "<input type="text" name="username">";
print "<input type=""text"\ name="passwort">";
print "<input type="submit">";
print "</form>";
if ($username && $passwort) {
#hier dann die pruefungen
#wenn sie korrekt sind dann soll zur sub cookie springen
cookie;
}
sub cookie {
my $cookie = $login->cookie(
{"name" => "cookiename", "value" => "cookievalue" } );
print $login->header (
{"cookie" => $cookie} );
}
Ich weiss das man den Cookie vor dem "Content-Type: text/html" schreiben muss aber dann kann ich ja kein loginformular ausgeben. Ich verzweifle :=((
bitte bitte helft mir noch einmal!!
gruezi Frey und einen schoenen tag euch allen!!
Hi,
Ich weiss das man den Cookie vor dem "Content-Type: text/html" schreiben muss aber dann kann ich ja kein loginformular ausgeben.
warum sollte das nicht gehen?
Cheatah
ich habe den letzten Thread mal rausgesucht (ich hoffe ich darf ihn hier reinschreiben??) http://forum.de.selfhtml.org/archiv/2008/9/t177472/
...
ich dachte mir ich poste jetzt einfach mal meinen code damit ihr genauer wisst wo ich gerade bin und ich denke so koennte man mir besser helfen. Ich habe uebrigends die unwichtigeren sachen rausgeloescht weil es sonst zu viel wird also zum beispiel die pruefung ob der user in der datenbank ist und ob das passwort stimmt usw hier also der code:#!/usr/bin/perl
use warnings;
use strict;
use CGI;my $login = new CGI;
my $username = $login->param("username");
my $passwort = $login->param("passwort");
Ich finde es erstmal ungeschickt, jeden userinput in einer
eigenen Variable zu speichern
Überlege dir den AHA-Effekt, wenn du einen hash nimmst
Etwas früher im Code
my %Input(
username => '',
password => '',
);
Wir initialisieren einen Hash für Usereingaben.
Die Initialisierung sagt uns: was sind überhaupt erlaubte Feldnamen für Userinput.
Die Konvention %Input (mit grossem erstem Buchstaben) deutet darauf hin, dass die Variable im globalen Scope erzeugt wurde, also in allen subs zur Verfügung stehen würde.
Du sprichst dann die Variable an mit:
$Input{password} = $login->param("passwort");
print "Content-Type: text/html\n\n";
print "<html><head></head><body>"
Achte darauf, dass du immer valides HTML ausgibst. Das title Element ist Pflicht.
print "Bitte loggen Sie sich ein:";
print "<form action="login.pl">";
Nutze verschiedene Möglichkeiten, um zu quoten:
print "<form action="login.pl">";
print '<form action="login.pl">';
print q(<form action="login.pl">);
print qq(<form action="login.pl">);
print "<input type="text" name="username">";
print "<input type=""text"\ name="passwort">";
print "<input type="submit">";
print "</form>";if ($username && $passwort) {
Das wird in meiner vorinitialisierten Version:
if( $input{username} && $input{passwort} ) {
#hier dann die pruefungen
#wenn sie korrekt sind dann soll zur sub cookie springen
cookie;
}sub cookie {
my $cookie = $login->cookie(
{"name" => "cookiename", "value" => "cookievalue" } );
print $login->header (
{"cookie" => $cookie} );
}
Ich weiss das man den Cookie vor dem "Content-Type: text/html" schreiben muss aber dann kann ich ja kein loginformular ausgeben. Ich verzweifle :=((
Verlagere den Block, der das Formular ausgibt in eine Subfunktion
sub print_loginform{ ... }
und rufe diese Subfunktion auf, wenn benötigt.
bitte bitte helft mir noch einmal!!
mfg Beat;
Hi Beat.
Scheinbar bin ich wirklich seeeeehr schwer von begriff den ich kapiere es immernoch nicht. Das mit dem Hash ist eine gute idee das aendere ich sobald das mit dem cookie klappt.
Ich habe es jetzt mal in eine Sub geschrieben aber ich weiss nicht wie das mir was nuetzen sollte denn es klappt immernoch nicht?
So sieht der Code jetzt aus:
#!/usr/bin/perl
use strict;
use CGI;
my $login = new CGI;
my $username = $login->param("username");
my $passwort = $login->param("passwort");
print "Content-Type: text/html\n\n";
print "<html><head><title>login</title></head><body>"
login;
sub login {
print "Bitte loggen Sie sich ein:";
print "<form action="login.pl">";
print "<input type="text" name="username">";
print "<input type=""text"\ name="passwort">";
print "<input type="submit">";
print "</form>";
if ($username && $passwort) {
#hier dann die pruefungen
#wenn sie korrekt sind dann soll zur sub cookie springen
cookie;
}
} # ende der sub
sub cookie {
my $cookie = $login->cookie(
{"name" => "cookiename", "value" => "cookievalue" } );
print $login->header (
{"cookie" => $cookie} );
}
Ich will jetzt nicht unhoeflich sein aber wenn man mir den code vielleicht grob umschreiben wuerde so das es klappt also so wie er sein muss wuerd ich vielleicht besser durchblicken?
Gruezi Frey
Ich habe es jetzt mal in eine Sub geschrieben aber ich weiss nicht wie das mir was nuetzen sollte denn es klappt immernoch nicht?
So sieht der Code jetzt aus:#!/usr/bin/perl
use strict;
use CGI;my $login = new CGI;
my $username = $login->param("username");
my $passwort = $login->param("passwort");print "Content-Type: text/html\n\n";
Damit hast du mit \n\n die herader Sektion abgeschlossen...
Du darfst nicht soviel ausgeben, wenn du später noch header (Cookies) schicken willst, sondern nur:
print "Content-Type: text/html\n";
Aber das folgende ist hier vollkommen deplaziert. Dies gehört viel mehr in den Kontext der Ausgabe der Server Response message-bodies
print "<html><head><title>login</title></head><body>"
Ich will jetzt nicht unhoeflich sein aber wenn man mir den code vielleicht grob umschreiben wuerde so das es klappt also so wie er sein muss wuerd ich vielleicht besser durchblicken?
Lerne, was ein http header ist, und was die Server Response Headersektion abschliesst.
mfg Beat
Dir wurde bereits im vorherigen Thread erklärt, dass man nachdem der Header gesendet wurde KEIN Cookie mehr versenden kann ...
print "Content-Type: text/html\n\n";
print "<html><head><title>login</title></head><body>"
Du hast den Header bereits im Hauptprogramm gesendet und kannst KEINEN weiteren Header mehr versenden.
sub cookie {
my $cookie = $login->cookie(
...
}
Aber trotzdem willst du einen versenden ...
Ein Code-Beispiel halte ich für keine gute Idee, aber es ist an sich ganz simpel.
Du gibst im Hauptprogramm KEINEN Header aus.
Gehe so vor:
1. Du überprüfst ob %usereingaben (bzw. $username, $userpasswort) undef sind.
1.1 wenn ja sendest du eine Sub in der der Header ist mit dem Login-Bereich.
2. du wertest nachdem die Usereingaben getätigt wurden aus.
2.1 ist der User in der DB, stimmt das Passwort überein usw.
3. wenn alles korrekt ist, sendest du die Sub die das Cookie versendet.
3.1 wenn nicht, gehe wieder zur login-seite.
Du hast so zwei Header (einmal für die Login-Seite und einmal für den Cookie-versand). Je nachdem sendest du die jeweilige Sub.
#!/usr/bin/perl
Du hast use warnings vwergessen
use strict;
use CGI;my $login = new CGI;
my $username = $login->param("username");
my $passwort = $login->param("passwort");print "Content-Type: text/html\n\n";
print "<html><head><title>login</title></head><body>"
Wenn du das CGI Modul schon einbindest, warum verwendest du es nicht?
Ich will jetzt nicht unhoeflich sein aber wenn man mir den code vielleicht grob umschreiben wuerde so das es klappt also so wie er sein muss wuerd ich vielleicht besser durchblicken?
In etwa so:
#!/usr/bin/perl
use CGI;
my $output = '';
my $action = CGI::param('action') || 'login';
my $cookie;
doLogin() if($action eq 'login');
print CGI::header(-cookie => $cookie), $output, CGI::end_html();
sub doLogin{
if(checkLogin()) {
$output .= CGI::start_html(-title=> 'Login')
. CGI::p("Bitte loggen Sie sich ein:")
. CGI::start_form()
. CGI::textfield(-name=> 'username')
. CGI::textfield(-name => 'passwort')
. CGI::submit(-value => 'Login')
. CGI::end_form()
;
} else {
$output .= CGI::start_html(-title=> 'Hallo'), CGI::p('Du bist eingeloggt');
}
}
sub checkLogin{
if(!CGI::param('passwort')) {
# kein Login
return 1;
}
$cookie = CGI::cookie(-name => 'id', -value => 'bla');
0;
}
Struppi.