Browserfenster und Session

Hallo zusammen,

ich habe eine etwas komplexere Webapplikation in PHP geschrieben, welche
Sessions benutzt, um beispielsweise den Weg des Nutzers durch die
Applikation zu speichern.

Folgendes Problem: Der Nutzer navigiert durch die Software bis zu einem
beliebigen Punkt und kommt dann auf die Idee ein weiteres Browserfenster
zu öffnen, um dort erneut die Software zu starten. Das neue
Browserfenster verwendet scheinbar die selbe Session und der Nutzer ist
somit automatisch angemeldet und befindet sich automatisch am selben
Punkt, wie im vorhergehenden Browserfenster.

Ich würde aber lieber erreichen, dass ein neues Browserfenster eine neue
Session/Cookie bekommt und der Nutzer somit die Software völlig autonom
in weiteren Browserfenstern nutzen kann.

Was muss man verändern, dass das funktioniert?

System: Debian, PHP 5.2.0-8
Session Support enabled
Registered save handlers files user sqlite
Registered serializer handlers php php_binary wddx

Directive Local Value Master Value
session.auto_start Off Off
session.bug_compat_42 On On
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly Off Off
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 100 100
session.gc_maxlifetime 1440 1440
session.gc_probability 0 0
session.hash_bits_per_character 4 4
session.hash_function 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /var/lib/php5 /var/lib/php5
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies Off Off
session.use_trans_sid 0 0

Viele Grüße
Martin
Martin Telzer [ Di, 06 November 2007 21:18 ] [ ID #1863993 ]

Re: Browserfenster und Session

..oO(Martin Telzer)

>ich habe eine etwas komplexere Webapplikation in PHP geschrieben, welche
>Sessions benutzt, um beispielsweise den Weg des Nutzers durch die
>Applikation zu speichern.
>
>Folgendes Problem: Der Nutzer navigiert durch die Software bis zu einem
>beliebigen Punkt und kommt dann auf die Idee ein weiteres Browserfenster
>zu öffnen, um dort erneut die Software zu starten. Das neue
>Browserfenster verwendet scheinbar die selbe Session und der Nutzer ist
>somit automatisch angemeldet und befindet sich automatisch am selben
>Punkt, wie im vorhergehenden Browserfenster.

Korrekt.

>Ich würde aber lieber erreichen, dass ein neues Browserfenster eine neue
>Session/Cookie bekommt und der Nutzer somit die Software völlig autonom
>in weiteren Browserfenstern nutzen kann.
>
>Was muss man verändern, dass das funktioniert?

Das ist eine Sache des Browsers. Üblicherweise gilt ein Cookie
browserweit, was auch durchaus sinnvoll ist. Wo ist denn in Deinem Fall
konkret das Problem mit mehreren Fenstern oder Tabs?

Micha
Michael Fesser [ Di, 06 November 2007 22:16 ] [ ID #1863994 ]

Re: Browserfenster und Session

Michael Fesser schrieb:
> Das ist eine Sache des Browsers. Üblicherweise gilt ein Cookie
> browserweit, was auch durchaus sinnvoll ist. Wo ist denn in Deinem Fall
> konkret das Problem mit mehreren Fenstern oder Tabs?

ein Nutzer soll Datensätze in eine Datenbank eintragen und hat dazu ein
Formular in welches er die Daten einträgt. Nun besteht die Anforderung,
dass er parallel dazu in einem weiteren Browserfenster recherchieren
soll, was bei ähnlichen Datensätzen bisher eingegeben wurde.

Der Einstiegspunkt zur Applikation ist immer die index.php. Da eine
Applikation aus mehreren Seiten besteht, gibt es einen
Kontrollflussgraphen, der den Ablauf für den Nutzer regelt. Der aktuelle
Punkt im Kontrollflussgraphen (hier speziell der Punkt "Daten einfügen")
ist in der Session gespeichert.

Jetzt öffnet der Nutzer ein neues Browserfenster, landet automatisch
wieder im Formular, weil das ja mit dem Punkt "Daten einfügen" verknüpft
ist. Er klickt jetzt herum und schaut sich alte Datensätze an (um
beispielsweise Textpassagen in das Formular des alten Browserfensters zu
übernehmen). Er wechselt damit den aktuellen Punkt im
Kontrollflussgraphen auf "Daten anzeigen". Dieser wird natürlich auch in
der Session vermerkt.

Jetzt ist er mit seinen Eingaben im alten Fenster fertig und drückt auf
speichern. Im Kontrollflussgraphen wird nun in den Punkt "Daten
speichern" gewechselt.

Nun kommt das Problem: Im Kontrollflussgraphen ist "Daten speichern"
kein gültiger Nachfolger von "Daten anzeigen". Aus
programmiertechnischer Sicht und Sicherheitsgründen, möchte ich solche
Sprünge im Graphen auch nicht zulassen.

Würde für jedes Browserfenster eine separate Session existieren, gäbe es
diese ungewollten Sprünge nicht.

Ich hoffe, das war jetzt nicht zu kompliziert :-)

Viele Grüße

PS: Das Beispiel ist stark vereinfacht. Tatsächlich geht es um zig
Eingabeformulare und einen Kontrollflussgraphen mit dreistelliger
Knotenanzahl. Der Graph ist zusätzlich geclustert und wird somit über
mehrdimenensionale Bezeichner angesprochen.
Martin Telzer [ Di, 06 November 2007 22:58 ] [ ID #1863995 ]

Re: Browserfenster und Session

Martin Telzer schrieb:
> Michael Fesser schrieb:
>> Das ist eine Sache des Browsers. Üblicherweise gilt ein Cookie
>> browserweit, was auch durchaus sinnvoll ist. Wo ist denn in Deinem Fall
>> konkret das Problem mit mehreren Fenstern oder Tabs?
>
> ein Nutzer soll Datensätze in eine Datenbank eintragen und hat dazu ein
> Formular in welches er die Daten einträgt. Nun besteht die Anforderung,
> dass er parallel dazu in einem weiteren Browserfenster recherchieren
> soll, was bei ähnlichen Datensätzen bisher eingegeben wurde.
>
> Der Einstiegspunkt zur Applikation ist immer die index.php. Da eine
> Applikation aus mehreren Seiten besteht, gibt es einen
> Kontrollflussgraphen, der den Ablauf für den Nutzer regelt. Der aktuelle
> Punkt im Kontrollflussgraphen (hier speziell der Punkt "Daten einfügen")
> ist in der Session gespeichert.

Kurz gesagt - Du verwendest $_SESSION und nicht $_GET oder Dateien zur
Steuerung dessen, was angezeigt werden soll? Aus meiner Sicht ist das
vorgestellte Problem so unlösbar, weil $_SESSION "browserweit" gleich
bleibt. Du kannst dann nur Deine Nutzer anweisen, zwei verschiedene
Browser gleichzeitig zu verwenden.

--
Mein Zeugs:
http://www.hadanite-marasek.de/classes.php
http://www.objektivsuche.de/
Ansonsten:
http://www.php-faq.de/q/q-newsgroup-wie-helfen.html
Hadanite Marasek [ Mi, 07 November 2007 00:07 ] [ ID #1863998 ]

Re: Browserfenster und Session

Martin Telzer schrieb:
> ein Nutzer soll Datensätze in eine Datenbank eintragen und hat dazu ein
> Formular in welches er die Daten einträgt. Nun besteht die Anforderung,
> dass er parallel dazu in einem weiteren Browserfenster recherchieren
> soll, was bei ähnlichen Datensätzen bisher eingegeben wurde.

wenn die Anforderung besteht muss man Ihm die Möglichkeit beim Eintragen
von Datensätzen die bisher eingetragenen zu sehen geben. Vielleicht wie
im Gästebuch, dass er oben einen neuen Eintrag hinzufügen kann und
darunter sieht er die 10 neusten Einträgen oder ähnliches. Die Lösung
sollte ja nicht sein, dass er ein neues Fenster öffnet und sich dann neu
einloggen muss um die Daten zu sehen (Wenn die Session nur pro Fenster
gelten würde).

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mi, 07 November 2007 09:30 ] [ ID #1864955 ]

Re: Browserfenster und Session

Martin Telzer schrieb:

> ein Nutzer soll Datensätze in eine Datenbank eintragen und hat dazu ein
> Formular in welches er die Daten einträgt. Nun besteht die Anforderung,
> dass er parallel dazu in einem weiteren Browserfenster recherchieren
> soll, was bei ähnlichen Datensätzen bisher eingegeben wurde.

Falscher Ansatz: Nicht der Nutzer soll ein weiteres Browserfenster
öffnen müssen, sondern die Anwendung sollte ihm an dieser Stelle eine
Recherchemöglichkeit anbieten. Dies kann durchaus in Form eines weiteren
Fensters geschehen. Dieses sollte ihm dann aber die Anwendung zur
Verfügung stellen und kontrollieren.

Ansonsten gäbe es noch die Möglichkeit, eine (versteckte) Kennung
durchzuschleifen. Daran könnte Dein Programm dann erkennen, wenn ein
zweites Fenster geöffnet wurde (dieses hat dann noch keine solche
Kennung), und diesem eine neue Kennung zuweisen. So könntest Du die
beiden "Sessions" auseinanderhalten.

Gruß. Claus
Claus Reibenstein [ Mi, 07 November 2007 10:00 ] [ ID #1864957 ]

Re: Browserfenster und Session

Claus Reibenstein schrieb:
> Ansonsten gäbe es noch die Möglichkeit, eine (versteckte) Kennung
> durchzuschleifen. Daran könnte Dein Programm dann erkennen, wenn ein
> zweites Fenster geöffnet wurde (dieses hat dann noch keine solche
> Kennung), und diesem eine neue Kennung zuweisen. So könntest Du die
> beiden "Sessions" auseinanderhalten.

wo soll er diese denn durchschleife? Session geht ja nicht, bleibt nur
per Hidden in Formularen oder per URL. Ist aber irgendwie beides dann
unschön. :)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mi, 07 November 2007 10:10 ] [ ID #1864959 ]

Re: Browserfenster und Session

Christoph Herrmann schrieb:

> Claus Reibenstein schrieb:
>
>> Ansonsten gäbe es noch die Möglichkeit, eine (versteckte) Kennung
>> durchzuschleifen. [...]
>
> wo soll er diese denn durchschleife? Session geht ja nicht, bleibt nur
> per Hidden in Formularen oder per URL.

Genau.

> Ist aber irgendwie beides dann
> unschön. :)

Deshalb schrieb ich ja auch: Falscher Ansatz.

Gruß. Claus
Claus Reibenstein [ Mi, 07 November 2007 10:20 ] [ ID #1864960 ]

Re: Browserfenster und Session

..oO(Martin Telzer)

>Michael Fesser schrieb:
>> Das ist eine Sache des Browsers. Üblicherweise gilt ein Cookie
>> browserweit, was auch durchaus sinnvoll ist. Wo ist denn in Deinem Fall
>> konkret das Problem mit mehreren Fenstern oder Tabs?
>
>[...]
>Nun kommt das Problem: Im Kontrollflussgraphen ist "Daten speichern"
>kein gültiger Nachfolger von "Daten anzeigen". Aus
>programmiertechnischer Sicht und Sicherheitsgründen, möchte ich solche
>Sprünge im Graphen auch nicht zulassen.
>
>Würde für jedes Browserfenster eine separate Session existieren, gäbe es
> diese ungewollten Sprünge nicht.

Ich bezweifle, daß sich sowas überhaupt vernünftig in einer Web-
applikation realisieren läßt, einfach weil es zu viele Variablen gibt
und sich viele Dinge gar nicht bzw. nur schwer kontrollieren lassen.

Dazu zählen ja nicht nur weitere Browserfenster, sondern z.B. auch ein
einfaches Betätigen der Zurück-Funktion im Browser. Wenn die aktuelle
Position des Benutzers im Graphen ständig in der Session protokolliert
wird, dann könnte schon ein einziges "Zurück" Dein Konzept zerschießen
und "ungewollte Sprünge" ermöglichen, da der Zustand im Browser nicht
mehr konsistent mit dem in der Session gespeicherten ist.

IMHO ist der gesamte Ansatz für's Web eher untauglich, aber das ist nur
eine gewagte Vermutung, da ich natürlich keine Details kenne.

Micha
Michael Fesser [ Mi, 07 November 2007 10:23 ] [ ID #1864962 ]

Re: Browserfenster und Session

Claus Reibenstein schrieb:
> Christoph Herrmann schrieb:
>
>> Claus Reibenstein schrieb:
>>
>>> Ansonsten gäbe es noch die Möglichkeit, eine (versteckte) Kennung
>>> durchzuschleifen. [...]
>> wo soll er diese denn durchschleife? Session geht ja nicht, bleibt nur
>> per Hidden in Formularen oder per URL.
>
> Genau.

Hm, aber dafür müsste man dafür sorgen, dass die selbe URL nur einmal
aufgerufen werden kann und danach ungültig wird (sonst kann man ja
einfach die URL kopieren und in einem neuen Fenster einfügen). Und für
jeden abgehenden Link eine neue Einmal-Kennung generieren, die
anschließend wieder verworfen werden...
Hm.. wenn ich grade so drüber nachdenke ließe sich sowas wahrscheinlich
am einfachsten mit einem internen Seitenzähler realisieren. Wenn
Seitenzähler und $_SESSION['seitenzaehler'] übereinstimmen ist es ok,
wenn nicht ist der Aufruf ungültig... Der Seitenzähler muss dann halt in
alle Links eingebaut werden.

Aber von der Möglichkeit mal abgesehen, ich halte das bei einer
"normalen" Webanwendung auch nicht für besonders sinnvoll.
Wahrscheinlich wärst du mit einer AJAX-Lösung (a la GMail) besser beraten...

Gruß
David
David Fuhr [ Mi, 07 November 2007 10:37 ] [ ID #1864964 ]

Re: Browserfenster und Session

Michael Fesser schrieb:
> Ich bezweifle, daß sich sowas überhaupt vernünftig in einer Web-
> applikation realisieren läßt, einfach weil es zu viele Variablen gibt
> und sich viele Dinge gar nicht bzw. nur schwer kontrollieren lassen.

schade. Da muss ich wohl meinen Ansatz nocheinmal grundlegend
überdenken. Vielleicht verlagere ich doch wieder mehr Parameter in die
URL, obwohl mir das ständige Durchschleifen auch viel zu fehleranfällig
erscheint. Vielleicht fällt mir aber auch noch etwas ein, wie ich den
Kontrollflussgraphen etwas robuster bekomme.

Vielen Dank an alle für die Antworten.

Viele Grüße
Martin
Martin Telzer [ Mi, 07 November 2007 21:10 ] [ ID #1865025 ]

Re: Browserfenster und Session

> ein Nutzer soll Datensätze in eine Datenbank eintragen und hat dazu ein
> Formular in welches er die Daten einträgt. Nun besteht die Anforderung,
> dass er parallel dazu in einem weiteren Browserfenster recherchieren
> soll, was bei ähnlichen Datensätzen bisher eingegeben wurde.

Seitenzustände in Sessions speichern ist ganz fies. Das an vielen Unis
eingesetzte StudIP macht das ganz exzessiv und wenn einen der Programmierer
mal treffe, würde ich ihm dafür gerne Gewalt antun, weil es tabbed browsing
etc völlig unmöglich macht.

Was Du hier vielleicht machen möchtest, ist eine Art Command Pattern. Du
schleifst per Hiddenvariable den Vewrweis auf das Command durch die
Formulare, und auf jeder Seite wird ein bestimmter Teil des Commands
festgelegt. Erneute Festlegung kannst Du ggf. innerhalb des Commands
verhindern (oder auch nicht, musst Du selbst wissen, ob man das darf oder
nicht). Am Ende wird dann alles (nach Konsistenzprüfung) auf einmal
eingetragen.
Ich sehe nicht, wo da Probleme auftreten sollten.
Jonas Werres [ Fr, 09 November 2007 11:45 ] [ ID #1866932 ]
PHP » de.comp.lang.php.misc » Browserfenster und Session

Vorheriges Thema: Was passiert eigentlic bei mail('FalscherName@web.de', 'Hallo Welt',$nachricht) ?
Nächstes Thema: Umstieg auf PHP5