Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czas trwania sesji php
Forum PHP.pl > Forum > PHP
elwierka
Niedawno zaczęłam naukę php i chcę wszystko pisać "ręcznie" żeby się nauczyć języka, a nie używając frameworków.

Po zalogowaniu się do aplikacji chcę, aby sesja trwała określony czas. Wiem, że ustala się to w pliku php.ini ale chodzi mi o coś innego. Chcę w pisanej aplikacji zrobić coś takiego, że osoba, która poprawnie zaloguje się do strony, może poruszać się po niej, dopóki nie minie określony czas. Poza tym chcę, aby po czasie bezczynności, np. 30 sek, sesja była niszczona, żeby nie można było przeglądać stron bez ponownego zalogowania się i najlepiej, jakby po upływie tego czasu od razu następowało przekierowanie do strony logowania. Chciałabym też, aby po wylogowaniu i wciśnięciu w przeglądarce przycisku "Przejdź do poprzedniej strony" - nie można było uzyskać dostępu poprzez ponowne przesłanie danych do skryptu. Obecnie mój skrypt logowania pozwala na to, dane są ponownie przesyłane, przez co znowu można zalogować sie do aplikacji i po niej się poruszać. Nie jest to bezpieczne.

Chcę też zrobić coś takiego, że jeśli jest się zalogowanym i np. wchodzę na stronę główną - a tu jest formularz logowania - żeby nie trzeba było za każdym razem się logować, tylko żeby aplikacja sama poznała - jeśli jest ktoś zalogowany, to przełącza do strony powitalnej itp...

Nie chcę używać ciasteczek. Czy da się to zrobić za pomocą tylko sesji? Wiem, jakie są funkcje sesji, czytałam w manualu, ale nie potrafię tego wszystkiego poskładać do kupy i stworzyć całkowitego kodu. Szukałam też gotowych rozwiązań w internecie, ale to wszystko nie było do końca takie, jak chcę.

Jak to zrobić?
thek
Jeśli chcesz, by można było ze strony korzystać X czasu od momentu zalogowania, to musisz przechowywać w bazie czas zalogowania i podczas każdego przechodzenia między stronami porównywać go z aktualnym. Gdy będzie większy niż X -> wyloguj/zniszcz sesję i przekieruj na stronę logowania.

Czas życia sesji możesz określić jako jeden z jej parametrów. Uważam jednak, że 30s to bardzo mało. Czasem tyle trzeba do przeczytania kilku postów w temacie. Użytkownik szybko się zdenerwuje musząc co chwilę logować. Jeśli chodzi o wstecz, to w przypadku wylogowania i próby dostępu do tej strony, powinno zaprotestować bo będzie brak prawidłowej sesji.

Jeśli sesja istnieje to uzależniaj wyświetlanie formularza logowania od zmiennych sesyjnych. Są -> wyświetl, brak -> olej to. Można dość ogólnikowo powiedzieć, że sesja to takie zmienne globalne.
marcint83
Witaj,

Da się to zrobić za pomocą sesji, w sumie najlepiej z ich pomocą to zrobić winksmiley.jpg
Mechanizm sesji samoczynnie ustawi odpowiednie ciasteczko

Na każdej stronie na której chcesz używać sesji musisz dać kod (na samej górze):
  1. ini_set('session.gc_maxlifetime', 30); //ustawienie w php.ini czasu bezczynnosci sesji na 30 sekund
  2. session_name("mojasesja");
  3. session_set_cookie_params(3600,"/",$_SERVER['SERVER_NAME']); //calkowity czas trwania sesji 3600 s


Teraz po poprawnym zalogowaniu użytkownika ustawiasz mu zmienna sesyjna np.
  1. $_SESSION['user_id']=1;


Jesli chcesz pokazac tresc tylko zalogowanym to piszesz tak:

  1. if($_SESSION['user_id']>0){
  2. //tu wpisujesz kod ktory ma byc dostepny tylko dla zalogowanych
  3. }else{
  4. //np. przekierowanie do logowania
  5. }


Zeby aplikacja "poznala" czy ktos jest zalogowany i przekierowala go na inna strona to wpisujesz:

  1. if($_SESSION['user_id']>0){
  2. header("Location: nowa_strona.php");exit;
  3. }



Powodzenia
askone
Hej

30s jako czas sesji to zdecydowanie zbyt mało. W niektórych systemach transakcyjnych banków długość sesji to 10 minut z jednoczesnym resetowaniem przy przeładowaniu.

Pozdrawiam
elwierka
Tak, 30 sek, to był tylko przykład....myślę, że w tej aplikacji nad którą pracuję, to 10 min bezczynności zdecydowanie wystarczy. No chyba, że czas, w którym wpisuje się dane do pól formularza, też jest uważany za bezczynność, to wtedy rzeczywiście będzie za krótko smile.gif
darek334
Cytat(marcint83 @ 24.08.2010, 13:17:59 ) *
Witaj,

Da się to zrobić za pomocą sesji, w sumie najlepiej z ich pomocą to zrobić wink.gif
Mechanizm sesji samoczynnie ustawi odpowiednie ciasteczko

Na każdej stronie na której chcesz używać sesji musisz dać kod (na samej górze):
  1. ini_set('session.gc_maxlifetime', 30); //ustawienie w php.ini czasu bezczynnosci sesji na 30 sekund
  2. session_name("mojasesja");
  3. session_set_cookie_params(3600,"/",$_SERVER['SERVER_NAME']); //calkowity czas trwania sesji 3600 s


Teraz po poprawnym zalogowaniu użytkownika ustawiasz mu zmienna sesyjna np.
  1. $_SESSION['user_id']=1;


Jesli chcesz pokazac tresc tylko zalogowanym to piszesz tak:

  1. if($_SESSION['user_id']>0){
  2. //tu wpisujesz kod ktory ma byc dostepny tylko dla zalogowanych
  3. }else{
  4. //np. przekierowanie do logowania
  5. }


Zeby aplikacja "poznala" czy ktos jest zalogowany i przekierowala go na inna strona to wpisujesz:

  1. if($_SESSION['user_id']>0){
  2. header("Location: nowa_strona.php");exit;
  3. }



Powodzenia


Nie to wogóle śmieci, z was tacy programiści PHP jak z koziej dupy trąba, takie ludowe przysłowie,
absolutnie nie ustawia się niczego poprzez zmienne globalne ini to jest totalne noobostwo i lamerstwo. To taka sama głupota jakbyśmy chcieli sobie ustawić nazwę ciasteczka sesji poprzez używając funkcji ini_set('session.name') no totalna bzdura. Do tego służą inne funkcje.
Proszę sobie poczytać o nich:
http://php.net/manual/pl/function.session-name.php
rad11
Tej funkcji tez praktycznie sie nie uzywa wiec wstrzymaj sie z czasem z komentarzami tego typu wink.gif
Xelah
Komentarz bezsprzecznie chamski, ale przyznać trzeba, że zaproponowane rozwiązanie wygląda jakby 'ślepy prowadził głuchego'.
darek334
Cytat(Xelah @ 17.05.2015, 14:24:43 ) *
Komentarz bezsprzecznie chamski, ale przyznać trzeba, że zaproponowane rozwiązanie wygląda jakby 'ślepy prowadził głuchego'.


smile.gif Nie dość że pomagam to jeszcze jaka wdzięczność smile.gif, dlatego nie chce się pomagać, raz że człowiek sam musiał do tych rzeczy dochodzić i za bardzo nie chce się potem tego zdradzać a dwa że po prostu czasami nie warto, tam nie zauważyłem, ale ktoś sugeruje grzebanie przy gc no to już wogóle porażka i tak dużo napisałem teraz kto ma rozum dojdzie jak to się robi...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.