2014-09-29 4 views
0

다양한 외부 API와의 통신으로 인해 일부 페이지가로드되는 데 오랜 시간이 걸리는 문제가 있습니다. 로드가 완료되기 전에 다른 페이지로 변경하거나 현재 페이지를 다시로드하면 내 세션이 중단되고 로그 아웃되는 것으로 나타났습니다.부분 페이지를 다시로드 할 때 세션이 손실됩니다.

예를 들어 about.php 페이지가로드 된 다음 about.php가 완전히로드되기 전에 profile.php를로드하기위한 링크를 클릭하면 나를 로그 아웃하고 다시 로그인 화면에 놓습니다.

무엇을 검색해야할지 모르지만 비슷한 문제에 대한 정보는 찾을 수 없습니다. 누구든지이 원인을 밝힐 수 있습니까? 각 페이지의

위 :

sec_session_start(); 

if(login_check($dp_conn) == false) 
{ 
    header("location:../login.php?error=1"); 
} 

sec_session_start() 함수 :

function sec_session_start() 
{ 
    $session_name = 'sec_session_id'; // Set a custom session name 
    $secure = false; // Set to true if using https. 
    $httponly = true; // This stops javascript being able to access the session id. 

    ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
    $cookieParams = session_get_cookie_params(); // Gets current cookies params. 
    session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); 
    session_name($session_name); // Sets the session name to the one set above. 

    session_start(); // Start the php session 
    session_regenerate_id(); // regenerated the session, delete the old one. 
} 

login_check() 함수 :이 다른 사람을 도울 수있는 내가 대답을 추가합니다

function login_check($db) 
{ 
    // Check if all session variables are set 
    if(isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) 
    { 
     $user_id = $_SESSION['user_id']; 
     $login_string = $_SESSION['login_string']; 
     $username = $_SESSION['username']; 

     $user_browser = $_SERVER['HTTP_USER_AGENT']; // Get the user-agent string of the user. 

     $query = "SELECT password FROM users WHERE id = " . $user_id . " LIMIT 1"; 
     $result = mysql_query($query, $db); 

     if (mysql_num_rows($result) == 1) 
     { 
      // If the user exists 
      $row = mysql_fetch_row($result); 
      $password = $row[0]; 
      $login_check = hash('sha512', $password.$user_browser); 

      if($login_check == $login_string) 
      { 
       // Logged In!!!! 
       return true; 
      } 
      else 
      { 
       // Not logged in 
       return false; 
      } 
     } 
     else 
     { 
      // Not logged in 
      return false; 
     } 
    } 
    else 
    { 
     // Not logged in 
     return false; 
    } 
} 
+0

세션 ID를 다시 만들겠다고 생각하는 sec_session_start()를 사용하고 있습니다. 보통 session_start()를 사용하여 시도하십시오. – BojanT

+0

죄송합니다. 해당 기능의 코드를 잊어 버렸습니다. 다른 매개 변수를 설정하는 함수 내부에서 session_start()를 사용합니다. –

+0

session_regenerate_id()는 새로운 세션 ID를 생성하고 새로운 페이지를로드하려고 할 때 첫 번째 세션이 종료되고 새 세션 ID를 설정하는 반면 두 번째 페이지는 이미 만료 된 이전 세션 ID를 이미 보냈습니다. '// session_regenerate_id(); '를 주석 처리 해주세요. – BojanT

답변

1

. 그래서 sec_session_start()를 사용하여 첫 번째 페이지가 세션 ID 완전히로드되지 않은 상태에서, 특히 귀하의 사이트가 매우 느리고 사용자 페이지를로드하는 경우

session_regenerate_id();

당신이 페이지에 다른 링크를 열어 모든 페이지 요청에 다른 세션 ID를 사용합니다 분실되어 문제를 일으킬 수 있습니다.

sec_session_start 기능에서 session_regenerate_id(); 만 제거하면됩니다.

관련 문제