Terve
Olen kohdannut seuraavanlaisen ongelman. Mulla on tollainen salasanan alla oleva sivusto mihin mennään täyttämään tietoja ja läheteään se.
Ongelmaksi on muodostunut ilmeisesti toi sessionin aikaraja. Onko siinä joku sisäänleivottu aikaraja, jolloin se palauttaa takaisin tohon login sivulle automaattisesti? ja jos on niin miten sitä pystyisi pidentämään huomattavasti ?
Joskus kun liian kauan olen sillä täyttö sivulla niin se palauttaa tohon alku, eli login sivulle, ton sivun lähettämättä sitä.
<?php session_start(); if (!isset($_SESSION['loggedin'])) { header("location: login.htm"); } ?>
Mod. vaihtoi PHP-kooditagit.
PHP:ä taitaa oletuksena olla 24-minuuttia session aikaraja. Katso itse php.ini:ä en jaksa kaivaa sitä esille.
Jos käyttäjä on painanut "Muista minut" kirjautuessaan sisään niin laitan käyttäjälle keksin jossa on salasana, käyttäjätunnus ja iposoite.
Ja sitten kun tämä keksi löytyy mutta sessiota ei, keksistä otetaan tunnukset ja kirjaudutaan taustalla uudestaan. Eli käytännössä käyttäjä on ikuisesti kirjautunut kunnes kirjautuu ulos tai ip osoite vaihtuu, session vaihtuminen ei ole mitenkään näkyvä käyttäjälle.
Sessiolle itselleen ei viitsi kauhean pitkää aikaa pistää ettei ne tiedostot kasaannu.
Tyyliin näin ennen mitään contenttia:
Olen nyt testannut tota php.ini ä, lisääkseni sitä sessionin time out -aikaa. Mutta joku tossa on vielä ongelmana, ei se ole lisääntynyt siitä 24 minuutista. Puuttuuko tosta jotain ? vai onko siinä jotain liikaa??
Mulla on toi koodin pätkä kaikilla sivuilla.
<?php ini_set("session.gc_maxlifetime", "14000"); session_start(); if (!isset($_SESSION['loggedin'])) { header("location: login.htm"); } ?>
Mod. vaihtoi PHP-kooditagit.
Tuo vaikuttaa vaan siihen että kuinka vanha sessiofilun pitää olla vähintään enneku sen saa luvan poistaa.
Sun pitää laittaa keksiin erikseen kestoa ennen session_start:
session_set_cookie_params(14000); session_start();
Pitääkö tohon määrittää myös joku polku johon sessio tallennetaan? Koska tuommosenaan toi ei toimi, eli ei lisää sitä 24minuutin aikaa suuremmaksi.
session_set_cookie_params(14000); session_start();
Tällä koodin pätkällä saan jonkin session tiedoston tallettumaan:
session_set_cookie_params(14000); session_save_path('.'); ini_set('session.gc_maxlifetime', '14000'); ini_set('session.gc_probability', 1);
Mod. vaihtoi PHP-kooditagit.
lainaus:
The problem (that some people before me have already noticed) with this is, that the cookie's timestamp is not updated on every new request. So while the visitor's navigating through your site or application, his session file's timestamp is updated and your gc_lifetime is configured properly so the file's not deleted by the server, but meanwhile the clock is ticking away on his locally stored session cookie. When it reaches the time limit: boom, session gone. (Actually, the session is still there on the server, the browser just stops sending the id with the requests, so the server can't identify the visitor and starts a new session.)
Kyseisistä kommenteista löydät varmaan ratkaisunkin ongelmaasi.
Pitäskö tota sessionia jotenkin resetoida välillä tossa if-lauseessa? Mä olen kyllä aivan hukassa tämän kanssa.
session_set_cookie_params(14000); session_save_path('.'); ini_set('session.gc_maxlifetime', '14000'); ini_set('session.gc_probability', 1); session_start(); if (!isset($_SESSION['loggedin'])) { header("location: login.htm"); }
Mod. vaihtoi PHP-kooditagit.
Katsoitko koko linkkiä? Heti seuraavassa kommentissa on todennäköisesti toimiva ehdotus, jossa käyttäjän session cookie ylikirjoitetaan joka sivunlatauksella.
PHP.net kirjoitti:
<?php $lifetime=600; session_start(); setcookie(session_name(),session_id(),time()+$lifetime); ?>
Joku viisaampi saakin ottaa kantaa siihen onko noin järkevä tehdä vai käyttää esim. esajeejee:n tyylistä ratkaisua.
Mod. lisäsi kooditagit.
Joo, kyllä mä olen tutkinu tota linkkiä. Ei tuolta sivulta näytä saavan ratkaisua ongelmaan. Ainoa asia jolla tähän mennessä olen saanut jatkettua sitä 24 minuutin "lomakken täyttöaika", on alla oleva koodi. Siinä on omat ongelmansa.
Tämä on selkeästi aika monimutkainen ratkaisu tätä kautta. Ehkä toi esajeejee:n vaihtoehtoinen ratkaisu malli on hyvä. Pitänee tutkia sitä vaihtoehtoa kuinka sen toteutetaan.
session_set_cookie_params(14000); session_save_path('.'); ini_set('session.gc_maxlifetime', '14000'); ini_set('session.gc_probability', 1);
Mod. poisti turhan lainauksen.
Itsekin painiskelin melko pitkään tuon sessionin 24 minuutin keston kanssa ja lopulta ratkaisin sen melkolailla samanlaisella ratkaisulla kuin esajeejee esitti.
Kun käyttäjä kirjautuessaan klikkaa muista minut, niin hänelle tehdään cookie joka vanhenee vuoden päästä ja laitetaan siihen käyttäjän id-numero, kirjautumisaika ja tätä tilannetta varten luotu uniikki id. Tämän lisäksi laitetaan tietokantaan ylös käyttäjän id, ip, kirjautumisaika ja uniikki id. Jos sitten käyttäjän istunto vanhenee, niin etsitään käyttäjän ip:llä tietokannasta rivi ja verrataan, että cookiessa olevat arvot täsmäävät tietokannassa oleviin arvoihin. Tässä on luultavasti paljonkin turhaa työtä, mutta hyvin se toimii. :P
Aihe on jo aika vanha, joten et voi enää vastata siihen.