• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Session timeout und iFrame

gazzle

Neues Mitglied
Hall zusammen,

ich sitze hier gerade vor einem Problem, bei dem ich partou nicht vorankomme. Ich habe eine Seite auf der ein iFrame geladen wird. Genauer gesagt ein SAP GUI for HTML. Dieser ist aber eine ganz normale Internetadresse mit URL, wird sozusagen vom SAP-System als HTML generiert.

Auf der Seite, die den Frame lädt gibt es ein session timeout, sodass nach 10min Inaktivität der Nutzer ausgeloggt wird und sich neu anmelden muss.
Nun passiert es häufiger, dass man länger in diesem HTML Gui ist und die Hauptseite es nicht "checkt", dass man auf der Seite arbeitet, also in dem iFrame.

Hat da jemand einen Rat für mich oder kennt dieses Problem bereits?

Für jegliche Hinweise oder Hilfe wäre ich sehr dankbar.

Grüße und Danke!
 
Du könntest von der Rahmenseite aus jede Minute oder so mit JavaScript/Ajax (müsste aktiviert sein) 'nen "Ping" an den Server schicken, um zu zeigen, dass die Hauptseite noch offen ist. Bei dem Request muss überhaupt nichts passieren, es muss nur ein Script ausgeführt werden, das die Session kurz mal anstößt (session_start). Die simpelste Möglichkeit der Umsetzung ist meiner Meinung nach mit jQuery: Ajax – jQuery API
 
Könntest du da ein Beispiel bringen? Mit PHP kenne ich mich zwar halbwegs aus, aber Ajax habe ich bisher noch nicht probiert, bzw. habe da keinen Dunst von. Bringe ich das in den iFrame unter? Denn in die SAP Gui for HTML Seite komme ich ja nicht ran um Code zu platzieren, dass läuft ja über das SAP-System.

Mir fällt da noch was ein. Das Timeout soll natürlich schon funktionieren und mit dem ein Minuten-Trick setze ich das Timeout ja komplett außer Kraft richtig?
 
Ja, damit würdest du den Timeout effektiv außer Kraft setzen. Das Script müsstest du in der umrahmenden Seite einfügen, nicht im iframe selbst. Ein Beispiel ist nicht sonderlich spektakulär:

Code:
window.setInterval(function () {
    $.get("test.php", function (data) {});
}, 30000);

Das JavaScript-Snippet ruft die Seite "test.php" alle 30 Sekunden auf.

Wenn du den Timeout beibehalten willst, kannst du versuchen, das Script in eine Art "onchange"-Handler des iframes einzuklinken. Falls das nicht geht (meine kurze Suche deutet darauf hin), könntest du versuchen, Events innerhalb des iframes in der rahmenden Seite abzufangen (etwa Mausklicks) und nur dann das Ajax-Script nicht mehr auszulösen, wenn seit x Sekunden kein Event mehr erfolgte.

Ich denke, das müsste klappen.
 
Danke erstmal für deine Hilfe. Eine Frage habe ich noch und zwar ist um den iFrame ein DIV. Kann ich da ein onclick-Event machen ohne das sich der Mauszeiger ändert oder die Seite sich ändert?

Da gibbet ja noch mehr Events...sehe ich grad.

onmouseover is vlt. auch net schlecht. Aber was müsste ich da reinpacken, dass die Seite so bleibt aber merkt, dass ich mich aufn div bewege :) ? - Bei der Logik haperts bei mir.
 
Zuletzt bearbeitet:
Eine Frage habe ich noch und zwar ist um den iFrame ein DIV. Kann ich da ein onclick-Event machen ohne das sich der Mauszeiger ändert oder die Seite sich ändert?

Das verstehe ich nicht.

onmouseover is vlt. auch net schlecht.

Die Idee ist's, Ereignisse, die im iframe ausgelöst werden, irgendwie in der Rahmenseite zu empfangen. Ich denke auch, mousemove eignet sich dafür am besten.

Es gilt dabei aber die Same Origin Policy zu beachten, fürchte ich. Ist das ein Problem?

Ein Beispiel (getestet im Firefox, Inhalt von test.html ist nicht von Bedeutung):

HTML:
<!DOCTYPE html>

<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>New</title>
        <script type="text/javascript">

            window.onload = function () {
                document.getElementsByTagName('iframe')[0]
                .contentWindow.document.addEventListener('mousemove', function () {
                    alert('mousemove');
                }, false);
            };

        </script>
    </head>

    <body>
        <iframe src="test.html"></iframe>
    </body>

</html>
 
Also mit dem DIV meine ich, dass es ein DIV-Element auf der Seite gibt in der der iFrame ist. (Ist nicht auf meinem Mist gewachsen und sieht wie folgt aus)

HTML:
<div><table>....<iframe></iframe></table></div>

Auf die Struktur habe ich keinen Einfluß.

Ich hatte gelesen, dass sone onmouseover und so weiter nicht mit Fensterelementen funktionieren. Daher dachte ich mach ich das onmouseover für den DIV.

Ob die Policy da erfüllt ist kann ich nicht sagen, die kenne ich nicht. Muss ich mir anschauen.

Die function() aus deinem Beispielcode, da müsste dann noch was kommen oder würde des reichen um des session timeout zu verhindern?
 
Hier ein komplettes Beispiel. (Die jQuery-Library sollte natürlich auf den eigenen Server kopiert werden.)

Das Update-Intervall von 5 Sekunden ist für den normalen Betrieb natürlich zu klein.

Zudem reagiert das Script nur auf Mouseevents. Falls 10 Minuten lang (oder wie auch immer der Timeout eingestellt ist) die Mouse nicht bewegt wird, wird auch so ein Timeout stattfinden.

Code:
<?php

session_start();

if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    /* AJAX-Request. No need to render whole page */
    exit;
}

?><!DOCTYPE html>

<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>New</title>
        <script src="http://code.jquery.com/jquery-latest.js"></script>
        <script type="text/javascript">

            var updateInterval = 5, // in seconds
                lastPing       = 0;

            function ping()
            {
                var currentDate = new Date(),
                    time        = 0;

                time = currentDate.getTime();

                if (time > lastPing + updateInterval * 1000) {
                    lastPing = time;
                    $.get("index.php");
                }
            }

            window.onload = function () {
                document.getElementsByTagName('iframe')[0].contentWindow.document
                        .addEventListener('mousemove', ping, false);
                window.addEventListener('mousemove', ping, false);
            };

        </script>
    </head>

    <body>
        <iframe src="test.html"></iframe>
    </body>

</html>
 
Zuletzt bearbeitet:
Zurück
Oben