2016-06-03 5 views
0

Я сделал этот простой сценарий входа (без доступа к базе данных), но сеанс остается активным (после закрытия браузера), даже если кнопка «запомнить меня» не отмечена. Как это исправить ...Сессия PHP остается активной после закрытия браузера

<?php 

define('LOGIN_URL', '/ab_batch/login/newlogin.php'); 

session_start(); 

$display_user = false; 

$loginForm = [ 
    'username' => [ 
     'value' => '', 
     'error' => false, 
     'err_msg' => '' 
    ], 

]; 

    if (isset($_POST['submit'])) { 

     $username = trim($_POST['username']); 
     $remember = (isset($_POST['remember']) && '1' == $_POST['remember']) ? true : false ; 

     if (empty($username)) { 

      $loginForm['username']['error'] = true; 
      $loginForm['username']['err_msg'] = "required"; 
     } 

     else { 

      $loginForm['username']['error'] = false; 

      $_SESSION['username'] = $username; 

      if ($remember) { 
      setcookie('my_cookie', $username, 180+time() , '/'); 

      } 

     } 



    } 


    if (isset($_GET['action']) && 'logout' == $_GET['action']) { 

     if (isset($_COOKIE['my_cookie']) && !empty($_COOKIE['my_cookie'])) { 

      setcookie('my_cookie' , null , -3600+time() , '/'); 

     } 

     session_destroy(); 

     header('Location: ' . LOGIN_URL); 
     exit(); 
    } 


    $session_user = null; 

    if (isset($_COOKIE['my_cookie']) && !empty($_COOKIE['my_cookie'])) { 

     $_SESSION['username'] = $_COOKIE['my_cookie']; 

    } 

    if (!$loginForm['username']['error'] && isset($_SESSION['username'])) { 
     $session_user = $_SESSION['username']; 
     $display_user = true; 


    } 

?> 

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="UTF-8"> 
     <title>Login</title> 

     <style type="text/css"> 

      .reqd { 

       color: red; 
      } 

      .result { 

       padding: 5px; 
       background-color: grey; 
       border: 1px solid black; 
      } 

     </style> 
    </head> 
    <body> 

     <?php if(!$display_user): ?> 
     <form action="" method="post"> 

      <p> 
       <label for="username">Username: <span class="reqd">* <?php echo 
       $loginForm['username']['error'] ? $loginForm['username']['err_msg'] : ''; ?></span></label><br /> 
       <input type="text" name="username" /> 
      </p> 

      <p> 
       <label for="remember">Remember me </label> 
       <input type="checkbox" value="1" name="remember" /> 
      </p> 
      <p> 
       <input type="submit" name="submit" value="Login" /> 
      </p> 
     </form> 


     <?php else: ?> 

     <div class="result" > 
      <h3>Welcome <?php echo $session_user; ?> </h3> 
      <a href="?action=logout">Logout </a> 
     </div> 

     <?php  endif; ?> 
    </body> 
</html> 

Ниже приводится ссылка на исходный код

https://codeshare.io/tHDHa

+0

убедитесь, что для 'session.cookie_lifetime' установлено значение 0, если вы хотите, чтобы файл cookie« уничтожить в браузере закрылся ». –

ответ

0

Сессия не истекает на сервере только потому, что браузер закрыт. Сессии - серверная. Если вы хотите завершить сеанс при закрытии окна браузера, вам нужно будет написать javascript AJAX-запрос, который вызывает на сервере session_destroy().

<script type="text/javascript"> 
    window.onbeforeunload = function (event) { 
     // Make an ajax call to run session_destroy() on server 
     $.ajax({url: "your.server.com/path/session_destroy.php", success: function(result){ 
      console.log(result); 
     }}); 
    } 
</script> 

Тогда у вас будет файл на вашем сервере с именем session_destroy.php. Этот файл будет содержать -

<?php 

session_destroy(); 

Это невероятно зачаточном реализации, но должны сделать то, что Вы желаете сделать.

+0

Я не знаю много о ajax ... не могу ли я это просто написать несколько строк php кода? –

+0

@AbhijitBorkakoty - как сервер знал бы, что вы закрыли окно? Клиент и сервер не связаны между собой автоматически. Позвольте мне обновить код, чтобы помочь вам. – Wes

+0

Существует также документация для установки INI, которая может быть, возможно, автоматически, без JS, но вы бы хотели протестировать ее во многих браузерах, чтобы убедиться, что она действительно работает через устройства/браузеры - http://php.net/manual /en/session.configuration.php#ini.session.cookie-lifetime – Wes

0

Попробуйте это:

ini_set('session.cookie_httponly', true); 
ini_set('session.use_cookies', true); 
ini_set('session.use_only_cookies', true); 
ini_set('session.use_trans_sid', false); 

Я надеюсь, что это помогает!

Смежные вопросы