Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10078[/thread]

sessionbasierter login mit perl

Leser: 4


<< >> 4 Einträge, 1 Seite
bjt1988
 2007-08-14 21:10
#98156 #98156
User since
2007-08-14
2 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich versuche seit 5 Stunden einen Sessionbasierten Login mit perl zu realisieren. Ich scheitere aber bereits daran das meine Testscripts die mir ne Session generieren beim aktualisieren der Seite immer wieder ne neue Session ID generieren was doch aber totaler blödsinn ist ?

Wenn eine registriert ist muss die doch so lange sie aktiv ist bzw. der Browser geöffnet ist auch gleich bleiben ansonsten ist der Sinn der Session ja dahin.

Folgendes Script verwende ich momentan zum testen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use constant SESSION_TIME => '60000'; 

use strict;
use CGI; 
use CGI::Carp qw(fatalsToBrowser set_message);
use CGI::Session;
use DBI; 
use Encode qw(encode);

my $db;
my $query;
my @row;
my $ergebnis;
my $spaltenname;
my $inhalt;
my $cgi;
my $sid;

my $cgiquery = new CGI;

print $cgiquery->header(-charset=>'ISO-8859-1', -expires=>'+1s', -type=>'text/html',);

require "/srv/v_address/cgi-bin/config.inc.pm";

my $db = &connectDBASE();
my $doc_root = &doc_root_path();


$CGI::Session::MySQL::TABLE_NAME = 'sessions';
my $sid = $cgiquery->cookie('cgisess') || $cgiquery->param('cgisess') || undef;
my $session = new CGI::Session("driver:MySQL", $cgiquery, {Handle=>$db});
my $sid = $session->id();
print $sid;


So ich bekomme ne session id angezeigt aber schon beim nächsten reload der seite ist es ne andere. wieso ist das so?
Gast Gast
 2007-08-14 21:49
#98157 #98157
Hi,
du machst ja auch mit new() explizit jedesmall eine neue Session auf. Soll er sich deinem Befehl wiedersetzen :-)
Code (perl): (dl )
1
2
3
4
5
6
 
$CGI::Session::MySQL::TABLE_NAME = 'sessions';
my $sid = $cgiquery->cookie('cgisess') || $cgiquery->param('cgisess') || undef;
my $session = new CGI::Session("driver:MySQL", $cgiquery, {Handle=>$db});
my $sid = $session->id();
print $sid;

da steht ja zwei mal my $sid = ...

Lies das mal ordentlich durch,
http://search.cpan.org/~markstos/CGI-Session-4.20/...
Vorallem die Methoden is_expired() und load() solltest du dir genauer ansehen.

Hier ein Beispiel aus der Docu, das schon sehr nah an dem Dran ist was du machen möchtest.
http://search.cpan.org/~markstos/CGI-Session-4.20/...
Code (perl): (dl )
1
2
3
4
5
6
7
    $s = CGI::Session->load() or die CGI::Session->errstr;
    if ( $s->is_expired ) {
        die "Your session expired. Please refresh";
    }
    if ( $s->is_empty ) {
        $s = $s->new() or die $s->errstr;
    }
bjt1988
 2007-08-14 22:06
#98159 #98159
User since
2007-08-14
2 Artikel
BenutzerIn
[default_avatar]
so ich habe das mal gebaut.
was ist da dran nun wieder falsch?
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
$CGI::Session::MySQL::TABLE_NAME = 'sessions';

my $session = CGI::Session->load() or die CGI::Session->errstr;
        if ( $session->is_expired ) {
                die "Your session expired. Please refresh";
        }
        if ( $session->is_empty ) {
                my $session = new CGI::Session("driver:MySQL", $cgiquery, {Handle=>$db});
                $session->expire(3600);
}
print $session;

die ausgabe ist das hier
CGI::Session=HASH(0x843a658)

und trotzdem schreibt er bei jedem refresh nen eintrag in die mysql session db tabelle
pfuschi
 2007-08-15 01:36
#98167 #98167
User since
2004-03-31
198 Artikel
BenutzerIn
[default_avatar]
Hi,
wenn ich die Manpage richtig verstanden habe checkt is_empty() ob etwas in der Session gespeichert ist.
Da du in deinem Programm mit der Session eigentlich garnichts anfängst ist diese vermutlich immer empty.
Änder das mal so ab:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
$CGI::Session::MySQL::TABLE_NAME = 'sessions';

my $session = CGI::Session->load() or die CGI::Session->errstr;
        if ( $session->is_expired ) {
                die "Your session expired. Please refresh";
        } else {
                $session = new CGI::Session("driver:MySQL", $cgiquery, {Handle=>$db});
                $session->expire(3600);
}
print $session;

Jetzt macht er immer dann wenn die Session expired ist eine neue.

Zusätzliche Lektüre für dich:
CPAN:CGI::Session::Tutorial


Ausserdem wirfst du völlig unkontrolliert mit "my" um dich.
Bedenke dass Variablen die mit my deklariert werden immer nur im jeweiligen Block gültig sind.

D.h. du hast in deinem Beispiel plötzlich zwei verschiedene $session Variablen gehabt.
Eine die im Main Block und die zweite die nur im zweiten if Block gültig war.

Viele Grüße
Manuel
PCE - Editor für Perl in Perl
Bookzilla.de - Mit jedem Kauf OpenSource unterstützen
"I know I can't hold the hate inside my mind
cause what consumes your thoughts controls your life"
- Creed
<< >> 4 Einträge, 1 Seite



View all threads created 2007-08-14 21:10.