Php megakadályozza az űrlap újraküldését. Hogyan akadályozhatom meg, hogy egy űrlap újra elküldjön egy üzenetet? Űrlapok újraküldésének megakadályozása ügyféloldali átirányítással

Egy időben elgondolkodtatott az a kérdés, hogy hogyan lehet megvédeni a webhely oldalait az űrlapadatok ismételt benyújtásától az oldalfrissítés során (persze, ha előtte volt beküldés).
Valószínűleg minden webmester és fejlesztő tudja, hogy ha egy weboldalon valamilyen űrlap kitöltésével rákattintott a „Küldés” gombra, akkor a beküldés után, ha megpróbálja frissíteni az oldalt, a böngészőben megjelenik egy üzenet, amely megerősíti az újraküldést.
Egyes esetekben ez elfogadhatatlan lehet. Például az elemi alak esetében visszacsatolás. Amikor a felhasználó kitöltötte az űrlapot és üzenetet küldött, majd valamilyen általa ismert okból frissítette az oldalt, a levél újra elküldésre került. Ez persze lehet, hogy nem olyan végzetes eset, csak példaként. Minden sokkal fájdalmasabb, például egy webáruházban történő rendelés feladásakor.
Ezért azon töprengtem, hogy találok-e megoldást erre a problémára, és rájöttem, hogy egyetlen megoldás létezik: átirányítás használata a fejléc űrlap elküldése után („helyszín: cím”). Azok. Egyszerű – elküldés után hívunk egy átirányítást (akár ugyanarra az oldalra is léphetsz), és kész! Az oldal frissítése tiszta lesz, befejezett POST-ok és GET-ek nélkül.

Minden rendben lenne, de személyesen tapasztaltam néhány problémát ezzel kapcsolatban. Ezek a következők. Korábban az átirányítások használata nélkül a webhelyeim adatküldésének mechanizmusa a következőképpen működött:
A felhasználó kitölti az űrlapot, rákattint a „küldés” gombra, a szkript elfogadja a küldött adatokat, ellenőrzi azok helyességét (érvényességét, a szükséges adatok kitöltését stb.) és választ ad - vagy sikeres volt a művelet, vagy hiba történt és hibalista (például: hiba - A „név” mező nincs kitöltve. A küldő oldalon pedig megjelenik a megfelelő üzenet: a küldés sikeres vagy nem sikerült.
Ha a beküldés sikertelen, az űrlap a képernyőn marad, és a mezői feltöltődnek a felhasználó által megadott adatokkal. Azok. az adatokat a $_POST változóból veszik (ha a metódus POST), és a megfelelő mezőkbe helyezik (azaz a postból visszakerülnek a mezőibe, hogy ne írják be újra). Hiszen mindenki ideges lesz, ha kitöltött egy űrlapot, és ne adj Isten valamit rosszul írt be, és amikor megpróbálja elküldeni, akkor üzenetet kap, hogy valamit rosszul töltöttek ki, és az űrlap frissül és üres újra. Egy hibásan kitöltött mező miatt pedig újra ki kell töltenie.
Így, ahogy már mondtam, sikertelen kitöltés esetén az űrlap a $_POST-ból vett adatokkal marad feltöltve, és a felhasználó kijavíthatja a hibás adatokat és újra elküldheti az űrlapot.
Minden rendben volt és minden működött.
De aztán átirányítással elküldtem, és kiderült, hogy a „küldés” gomb megnyomása után, ha a kitöltés sikertelen volt, az űrlap frissült és a kitöltött mezők már nem maradhattak benne, mert Korábban automatikusan kitöltötték a $_POST tömbből, de most, az átirányítás után, a $_POST törlődött, mintha nem történt volna küldés.
De erre az esetre is volt kiút. Használjon munkameneteket. Azok. A fejléc hívása előtt vigye át az adatokat a POST-ból a munkamenet-változókba, és csak ezután működjön vele az átirányítás után.
Ennek eredményeként a kód jelentősen bonyolultabbá vált. A hibakeresés bonyolultabb lett, mert Általában nehéz meghatározni, hogy mi történik a függvényekkel abban a pillanatban, amikor az átirányítás megtörténik. Ha valamilyen hibát vétett a kódokban (ami pontosan a küldés pillanatában jelenik meg), akkor az nem is jelenik meg, mert átirányítás történik, és nem is látja a hibaüzenetet.
Általánosságban elmondható, hogy miután implementáltam a fejlécet a kódjaimba, nehezebbé vált az alkalmazásaimmal való munka. A fejlesztés/finomítás/hibakeresés bonyolultabbá vált. De ezt sem tagadhatom meg.
És továbbra is kíváncsi vagyok: vannak más, elegánsabb megoldások?

Gyakran kapok kérdéseket az űrlapok újraküldésének visszavonásával kapcsolatban. Például elkészített egy űrlapot egy megjegyzés hozzáadásához, és hozzáadott egy kezelőt ugyanarra az oldalra. Ezután megjegyzés hozzáadásakor az sikeresen hozzáadásra kerül, de amint a felhasználó megnyomja az F5 billentyűt, újra elküldi az űrlapot. A felhasználó pedig könnyedén megnyomhatja az F5-öt, ha az oldal betöltése sokáig tart. Ennek eredményeként 1 megjegyzés helyett 2 vagy még több lesz. Ebben a cikkben megmutatom, hogyan lehet ezt elkerülni.

Először nézzük meg részletesebben a problémát, példaként használva ezt a kódot:









A "Négyzet" gombra kattintva láthatja a szkript eredményét. De amint a felhasználó ezután megnyomja az F5 billentyűt, a szkript újra lefut. Ebben az esetben ez nem olyan kritikus, mint megjegyzés hozzáadásakor, de miért van szükség a szerver extra terhelésére?

Most beszéljünk a probléma megoldásának módjairól. Az első módszer a feldolgozó parancsfájl külön fájlba történő szétválasztása. Ezután az űrlapcímke action attribútumában hozzá kell adnia a szkript elérési útját. Magának a szkriptnek pedig el kell mentenie valahova műveleteinek eredményét, vagy a szkripthez érkezett változókat, majd vissza kell irányítania. Általában nézze meg a szkript kódját:

Az űrlapot tartalmazó oldal kódja pedig így fog kinézni:









Ennek a megközelítésnek a hátránya nyilvánvaló - egy ilyen egyszerű szkripthez másik fájlt kell létrehoznia. Ezért a második módszerről mesélek, hogyan kerülheti el az űrlap újbóli beküldését:









Itt a feldolgozás ismét ugyanabban a fájlban történik, de a legfontosabb különbség az, hogy a végén egy átirányítás van ugyanarra az oldalra. Ennek eredményeként az oldal az űrlap elküldése után újra betöltődik, és a böngésző nem kéri a felhasználót az űrlap újbóli beküldésére az F5 billentyű lenyomására.

Hadd foglaljam össze, hogyan lehet törölni egy űrlap újraküldését:

  • Vagy végezze el a feldolgozást külön fájl, majd irányíts vissza onnan.
  • Vagy végezze el a feldolgozást ugyanabban a fájlban, mint az űrlap, de a feldolgozás után végezzen átirányítást ugyanarra az oldalra.

Ez egyszerű szkriptekben így történik. És az összetetteknél végül ugyanaz történik.

Tegyük fel, hogy készítünk egy szkriptet, amely a POST módszerrel beküldött űrlap adatait fogadja el. A szkript fogadta az adatokat, feldolgozta és megjelenített egy oldalt az eredménnyel. De ha a felhasználó úgy dönt, hogy ebben a pillanatban frissíti az oldalt, egy ehhez hasonló üzenetet fog látni:

Az oldal megjelenítéséhez a Firefoxnak olyan információkat kell küldenie, amelyek megismétlik a korábban végrehajtott műveleteket (például keresési kérést vagy online vásárlást).

És két gomb. Az egyikre kattintva újra elküldi az adatokat, ami gyakran nem kívánatos. A másodikra ​​kattintva az oldal nem frissül. Mindenesetre a felhasználó nem érzi jól magát egy ilyen üzenettől. A felhasználók általában nem igazán szeretik a mindenféle felugró ablakot.

Kezdésként megmutatom a forgatókönyvet, amelyet véglegesíteni fogunk.

Egyszer küldheti be az űrlapot, majd nyomja meg a Ctrl+R billentyűkombinációt, és megjelenik a balszerencsés ablak. Szabaduljunk meg tőle.

De először egy szó a poszt szponzorától - egy oldal hasznos tartalommal Samsung telefonok, amely témákat kínál Samsung gt s5230-hoz, háttérképeket és egyéb dolgokat.

Űrlap újraküldésének megakadályozása kiszolgáló átirányítással

Az űrlapadatok újbóli elküldésének megakadályozása érdekében végezhet kiszolgáló-átirányítást. Ez úgy történik, hogy elküldi a böngészőnek a Location fejlécet a kívánt URL-lel. Ez lehet például egy köszönő oldal, amiért kitöltötte az űrlapot. Akkor írunk valami ilyesmit:

Ebben az esetben a szerver fogadja az adatokat, feldolgozza azokat, és az eredmény megjelenítése helyett elküldi a klienst egy oldalra, ahol ez az eredmény megjelenik.

Ennek a módszernek az a hátránya, hogy a felhasználó a vissza gombra kattintva visszatérhet az átirányított oldalra. Újra előredobja, így a felhasználó aligha tud majd két oldalt visszaadni az eredetileg kitöltött űrlapra.

Űrlapok újraküldésének megakadályozása ügyféloldali átirányítással

Az ügyfél-átirányítást ügyfél-átirányításnak nevezik, mert az ügyféloldalon történik. Vagyis a böngészőben. Az ügyfél-átirányítás JavaScript és metacímkék használatával történhet.

A JavaScript előnye, hogy felülírja a böngésző előzményeit, így még ha a felhasználó a böngésző Vissza gombjára kattint is, nem tér vissza arra az oldalra, amelyet az űrlapkezelő visszaadott. Vagyis az ablak teljesen eltűnik. De néhány embernek le van tiltva a JS.

A META címkéknek viszont megvan az az előnye, hogy sokoldalúak. Mindenkit átirányítanak, mindig.

Az lenne az optimális, ha ezt a két módszert kombinálnánk. Hogyan - írja le egy jegyzetben Alekszandr Shurkajev optimális átirányítás.

Az ő módszerét a következőképpen alkalmazzuk.

Próbáljuk meg! Most, amint látja, nem jelenik meg ablak. Mit csináltunk? Ellenőriztük. Ha az adatok megérkeztek, akkor mindent megjelenítünk, ami az átirányításhoz szükséges. Elvileg ezek után akár ki is lehet lépni, hogy ne terhelje a böngészőt felesleges adatokkal, amiket úgysem lát majd senki.