Forum: PC-Programmierung Javascript/HTML: reload() - Problem


von Jürgen W. (lovos)


Lesenswert?

Hallo,
ich habe eine dynamische Website (php).
Im ersten Schritt schickt die Website ein Formular mit Post an sich 
selbst. Darauf hin wird der Inhalt dynamisch geaendert.

Wenn ich im Browser nach einiger Zeit auf den Reload-Button druecke 
(Firefox Strg-R), wird der gleiche Post wieder an die Website geschickt.
Das soll nicht sein.
Deshalb habe ich eine Hilfsloesung: Im HTML-Code befindet sich ein 
modifizierter Reload-Link.
1
[a javascript:location.replace(
2
  www.website.de/cgi-bin/prog.php)>Reload[/a]

Lieber waere mir, ich koennte es so programmieren, dass durch eine 
javascript-Routine die Website (d.h. der Browser, der sie gerade 
geoeffnet hat) den Post einfach vergisst.
D.h. Beim ersten Aufruf wird ein Post an die selbst Website geschickt.
Durch diesen 2. Aufruf wird der Inhalt dynamisch geaendert und 
vergangegene Post im Browser geloescht.
Beim Druecken auf Reload-Button des Browser erfolgt dann ein dritter 
Aufruf der Website ohne Post-Anhang.
Kann man sowas programmieren?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Warum überhaupt reload?
Mit JavaScript ist es möglich, ohne Reload dynamisch Daten zu 
aktualisieren, das ist Grundlage z.B. von Ajax.

von Jürgen W. (lovos)


Lesenswert?

Ich will sie ja nicht automatisch aktualisieren, sondern auf Bedarf, 
naemlich wenn der Benutzer auf Reload drueckt.
Nur das erste Post, wenn die Seite das erste Mal im Browser aufgerufen 
wird, erfolgt automatisch.
Eine andere Hilfsloesung waere, nach dem ersten Post, d.h. zweiten 
Aufruf, gleich mit location.replace() einen dritten Aufruf OHNE Post zu 
erzwingen.
Die Loesung muss ich ablehnen, da die Website fuer mobile devices 
bestimmt ist, und "Datendurchsatz" und "Zeit zum laden" eine Rolle 
spielt.

Mit Ajax habe ich noch nicht soviel gemacht, damit koennte ich 
vielleicht was probieren.

von PI314 (Gast)


Lesenswert?

Die saubere Lösung des Problems - wenn ich das richtig verstanden habe - 
heisst Session (serverseitig). Ob dabei clientseitig mit oder ohne JS 
gearbeitet wird, ist nicht so wichtig. Generell sollte man nie eine 
Funktionalität von der clientseitigen Verfügbarkeit von JS abhängig 
machen.
Eine weitere Möglichkeit, Trafic zu reduzieren besteht in der 
Manipulation des HTTP Headers. (Je nach dem, ob es serverseitig die 
Änderungen tatsächlich gibt, kann man den Browser dazu bewegen, die 
Seite vom Cache zu rendern, und nicht vom Server zu ziehen.)
Firebug und HTTP Spec sind da Deine beste Freunde ;)

von Jürgen W. (lovos)


Lesenswert?

>Generell sollte man nie eine
>Funktionalität von der clientseitigen Verfügbarkeit von JS abhängig
>machen.

Im Prinzip ja. Aber meine Funktionalitaet ist zu speziell, dass ich auf 
JS verzichten koennte. Wenn jemand meint, er muesste aus 
Sicherheitsgruenden Cookies und JS deaktivieren, dann soll er es halt 
bleiben lassen.
Man kann es nie allen recht machen.

Ich braeuchte eine Methode, um von JS den aktuellen POST-Status im 
Browser zu manipulieren.
Das muesste m.E. im Objekt windows.location sein, aber da gibt es keine 
Funktionen in dieser Richtung.

von PI314 (Gast)


Lesenswert?

Jürgen G. schrieb:
> Ich braeuchte eine Methode, um von JS den aktuellen POST-Status im
> Browser zu manipulieren.
Was meinst du damit? Es gibt kein Status bei POST... Du kannst über JS 
POST eines Formulars auslösen. Um die Stati muss man sich selbst 
kümmern, z.B. über coockie (kaum empfehlenswert) oder hidden-Felder 
(schon etwas besser), oder noch besser - eine einzige SessionID (und der 
Rest wird serverseitig gespeichert).

> Das muesste m.E. im Objekt windows.location sein, aber da gibt es keine
> Funktionen in dieser Richtung.
Dort kann es sie auch nicht geben! Vergiss nicht, dass windows.location 
eigentlich mit GET (und gar nicht mit POST) zu tun hat :)

Und der entscheidende Punkt: HTTP kennt keine Stati (bis auf coockies, 
die den Browser ohnehin nicht interessieren und clientseitig - wenn 
überhaupt - nur über JS ausgewertet werden können.)

Das ist warum man hier ohne Session (serverseitig) nicht weiter kommt :)

von Simon B. (nomis)


Lesenswert?

Ich glaube du willst soetwas machen, wie hier im Forum.

Wenn Du einen Beitrag schreibst, wird der per POST abgeschickt, das 
generierte Dokument ist dann im Wesentlichen nur ein Redirect 
(vermutlich auf GET) auf die Threadanzeige, in der dann der neue Beitrag 
zu sehen ist.

Ein Reload bewirkt nun ein Neuladen der Threadanzeige und nicht etwa ein 
erneutes Absenden des POST-Requests.

Viele Grüße,
        Simon

PS: Gerade nochmal an diesem Posting getestet:

Das POST ergibt ein HTTP/1.1 302 Found, mit der Location 
Beitrag "Re: Javascript/HTML: reload() - Problem"

Der Browser macht ein GET auf diese URL und erhält ein
HTTP/1.1 301 Moved Permanently mit der Location
Beitrag "Re: Javascript/HTML: reload() - Problem"

daraufhin macht der Browser noch ein GET und landet in der 
Threadanzeige.

von PI314 (Gast)


Lesenswert?

Ehrlich gesagt, kann ich deine Schwirigkeiten nicht nachvollziehen... Du 
machst doch in PHP, oder? Dort gibt es seit Steinzeit eine durchaus 
brauchbare Implementierung der serverseitigen Session. Und die Beispiele 
sind auch wie Sand am Meer vorhanden. Warum willsd du unbedingt und auch 
freiwillig diesen aussichtlosen JS-Kopfstand machen?

von Jürgen W. (lovos)


Lesenswert?

>Und der entscheidende Punkt: HTTP kennt keine Stati (bis auf coockies,
>die den Browser ohnehin nicht interessieren und clientseitig - wenn
>überhaupt - nur über JS ausgewertet werden können.)

Wenn das JS mit document.form.submit() einen Post abschickt, dann merkt 
sich das der Browser irgendwie. Denn nach einen weiteren Reload-Press 
wird der/das gleiche Post wieder abgeschickt. Habe ich verifiziert.
Das meinte ich mit 'Status'. Neben der HTML- und der URL-Anzeige ist 
noch eine weitere Information vorhanden, die sich der Browser von einem 
Seitenaufruf zum naechsten behaelt. Das meinte ich mit Status.


>Ein Reload bewirkt nun ein Neuladen der Threadanzeige und nicht etwa ein
>erneutes Absenden des POST-Requests.

So will ich das (nur Neuladen), aber der Browser sendet den Post 
nachmals ab.

>Ehrlich gesagt, kann ich deine Schwirigkeiten nicht nachvollziehen... Du
>machst doch in PHP, oder? Dort gibt es seit Steinzeit eine durchaus
>brauchbare Implementierung der serverseitigen Session. Und die Beispiele
>sind auch wie Sand am Meer vorhanden. Warum willsd du unbedingt und auch
>freiwillig diesen aussichtlosen JS-Kopfstand machen?

Ich arbeite ja auch mit sessions (selbst implementierte mit Cookies).
Aber das eine hat mit dem anderen in diesem Fall nichts zu tun.
PHP laeuft auf dem Server. Ich brauche aber eine clientseitige Loesung, 
damit nicht die gleichen Posts wiederholt verschickt werden.
Ajax koennte eine Loesung sein. Damit kann einen Post verschicken, den 
sich der Browser vielleicht nicht merkt. Kann ich aber erst heute abend 
testen.

von PI314 (Gast)


Lesenswert?

Jürgen G. schrieb:
> Wenn das JS mit document.form.submit() einen Post abschickt, dann merkt
> sich das der Browser irgendwie.

Ja. Das ist meines Wissens eine nett gemeinte, in der Praxis aber eher 
störende Feature des Browsers. Auch bei AJAX stört das mehr als nutzt 
(die berühmte Zurück-Button Problematik). Was bleibt, sind die 
Workarounds wie Redirect oder die serverseitige Sessionsverwaltung :(

> Ich arbeite ja auch mit sessions (selbst implementierte mit Cookies).
Was war denn schlecht an der PHP-Implementierung? Sie nutzt ein einziges 
Sessioncookie zum speichern von ID, macht das aber ziemlich transparent. 
Den Client noch stärker zu entlasten ginge kaum :)

> Aber das eine hat mit dem anderen in diesem Fall nichts zu tun.
Schade, eigentlich... das wäre nämlich die einfachste Lösung deines 
Problems. Wenn du das aber unbedingt komplizierter haben willst, nimm 
einfach die Sourcen von Firefox und schaue, wie das dort implementiert 
wurde. Fielleicht kannst du das einfach schnell fixen...

von Jürgen W. (lovos)


Lesenswert?

>Ja. Das ist meines Wissens eine nett gemeinte, in der Praxis aber eher
>störende Feature des Browsers. Auch bei AJAX stört das mehr als nutzt
>(die berühmte Zurück-Button Problematik).

Aha, das wusste ich nicht.

> Was war denn schlecht an der PHP-Implementierung?
Das ganze ist eine ziemlich umfangreiche Angelegenheit.
Da das ganze auf dem Browser eines Smartphone nutzbar sein soll, 
bestehen da weitere Einschraenkungen.
Es geht nicht darum, dass die PHP-Statemaschine mit unnoetigen Posts 
durcheinander kaeme, sondern dass ich nicht will, dass Daten unnoetig 
verschickt werden. Eine menschliche Schwaeche also.
Zumal es sich Zugangsdaten handelt.

von PI314 (Gast)


Lesenswert?

Jürgen G. schrieb:
> Zumal es sich Zugangsdaten handelt.

Ohje... das scheint noch schlimmer zu sein :( Also, eine nach dem 
anderen:
Wenn du die Seite zum ersten mal aufrufst, werden die Daten bereits 
verschickt.
1
GET /index.php HTTP/1.1
2
Host: www.mysite.net
3
Accept: */*
Setzt du danach in der Serverantwort ein cookie,
1
HTTP/1.1 200 OK
2
Content-type: text/html
3
Set-Cookie: mycookie=myvalue
wird dieses bei JEDEM nachfolgenden Aufruf (auch bei "nur reload 
machen") verschickt, ob du das willst oder nicht:
1
GET /index.php HTTP/1.1
2
Host: www.mysite.org
3
Cookie: mycookie=myvalue
4
Accept: */*

Du kannst natürlich dein Cookie nicht per Response Header, sondern in JS 
bereits clientseitig setzen und erst später am Server auswerten. Wenn du 
den Client (=einen relativ schwachbrustigen Smartphone) unbedingt mit JS 
zum schwitzen/Batterie entleeren bringen willst, kannst du noch mehr 
unsinnige Sachen mit erhöhten Spassfaktor anstellen. Was du aber nicht 
verhindern kannst ist, dass alle gesetzten Cookies jedesmal brav zum 
Server fliegen (und der böse Hacker sie dabei ohne weiteres abgreifen 
kann).

Die saubere Lösung ist:

- bei dem ersten Aufruf (wen noch kein cookie da ist) eine 
unique-Sessionid am Server generieren und als cookie im Browser setzen 
(besser noch - kein Rad neu erfinden, sondern PHP das machen lassen);
- die Authentifizierungsdaten nur EINMALIG zum Server senden, und dort 
den Status in der Session merken;
- nach der Authentifizierung über HTTP Redirect zu einer anderen Seite 
verweisen, die der Benutzer refreshen kann, bis der Arzt kommt. Da diese 
kein Formular enthält, wird auch nichts unnötig gepostet.

Jede andere "Lösung" bedeutet, dass du nicht weniger, sondern mehr Daten 
unnötig hin und her fliegen lässt :)

von Jürgen W. (lovos)


Lesenswert?

>Wenn du die Seite zum ersten mal aufrufst, werden die Daten bereits
>verschickt.

Nee, die werden erst verschickt, nachdem der Benutzer auf dem 
HTML-Tastaturfeld (input/button) einen Code (kein Passwort) eingegeben 
hat.
Wie man das ohne JS machen kann, wuerde ich gerne wissen.
Und den Code ueber die Smartphone-Tastatur ist nicht dolle.
So was sollte man bedenken.
Danach postet das JS zur php-Seite, diese wertet die Daten aus und 
generiert die Session.

>nach der Authentifizierung über HTTP Redirect zu einer anderen Seite
>verweisen
Vielleicht geht auch ein Redirect auf die gleiche Seite?!
Ich glaube ich habe die Loesung:
Wenn die Zugangsdaten passen (beim 2. Aufruf durch JS form.submit()), 
dann wird nur der Redirect-Header zurueckgeschickt.
Danach erfolgt ein weiterer Aufruf (hoffentlich) ohne Post-Daten

von PI314 (Gast)


Lesenswert?

Jürgen G. schrieb:
> Wie man das ohne JS machen kann, wuerde ich gerne wissen.
Z.B. so:
1
<form action="index.php" method="post">
2
Enter your code:<input type="text" name="code" />
3
<input type="submit" value="Send to derver"/>
4
</form>

von Jürgen W. (lovos)


Lesenswert?

Und wie soll ich den Code eingeben, wenn ich keine Tastatur habe, oder 
weil sie zu klein ist, sondern das Touch-Display benutzen will?

von Max (Gast)


Lesenswert?

Bildschirmtastatur. Wie soll man sonst mit dem Smartphone schreiben 
können?

Wenn du das Input-Feld noch zusätzlich über Buttons ändern willst:
http://de.selfhtml.org/javascript/beispiele/anzeige/taschenrechner.htm

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.