2016-09-04 2 views
-1

죄송합니다. 좋은 것을 작성하는 것은 항상 어렵습니다.세션 변수가 액세스하기 전에 세션을 시작한 경우에도 세션 변수가 손실 됨

함수를 사용하여 세션을 시작하므로 모든 것을 선언/구성 할 수 있습니다.

public static function sec_session_start() { 
    if (ini_set('session.use_only_cookies', 1) === FALSE) { 
     $session_error = 'Error: Cannot create new user session.'; 
     return $session_error; 
    } 
    else { 
     $session_name = 'aet_session_id'; 
     $domain   = '.domain.com'; 
     $secure   = TRUE; 
     $httpOnly  = TRUE;       // prevents cookie theft 

     // Get the current cookies params. 
     $cookieParams = session_get_cookie_params(); 
     // Set the current cookies params. 
     session_set_cookie_params($cookieParams['lifetime'], $cookieParams['path'], $domain, $secure, $httpOnly); 

     // Sets the session name to the one set above. 
     session_name($session_name); 
     session_start();        // Start the PHP session 

     if (!isset($_SESSION['CREATED'])) { 
      $_SESSION['CREATED'] = time(); 
     } else if ((time() - $_SESSION['CREATED']) > 1800) { 
      // session started more than 30 minutes ago 
      session_regenerate_id(TRUE);    // change session ID for the current session and invalidate old session ID 
      $_SESSION['CREATED'] = time();    // update creation time 
     } 
/* 
     $hasExpired = FALSE; 

     if (isset($_SESSION['staff_id'], $_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY']) > 9999) { // 300 (5 mins) 
      // last request was more than 5 minutes ago 
      $_SESSION = array();      // unset $_SESSION variable for the run-time 
      $params = session_get_cookie_params();  // Get session parameters 
      setcookie(session_name(),     // Delete the actual cookie 
         '', 
         time() - 3600, 
         $params["path"], 
         $params["domain"], 
         $params["secure"], 
         $params["httponly"]); 
      session_destroy();       // destroy session data in storage 

      $hasExpired = TRUE;       // now we know the user has lost his session for inactivity 
     } 

     $_SESSION['LAST_ACTIVITY'] = time();   // update last activity time stamp*/ 
    } 

    //return $hasExpired; 
} 

이 함수는 각 도메인/하위 도메인의 모든 index.php에서 초기화되는 클래스에 속합니다.

나는 하위 도메인 지정하는 경우 : 쿠키 (session_set_cookie_params()), 다음 세션 변수는 하위 도메인 작동에 대한

$domain = 'sub.domain.com'; 

을하지만 난 내가 떠나, 하위 도메인 이름을 제거 다른 하위 도메인에 대해 동일한 세션을 필요 도메인 이름 앞에 오는 점 :

옵션 메모 (이것은 처음부터 주 도메인과 여러 하위 도메인에서 세션이 필요한 다른 웹 사이트에 대해이 프레임 워크를 작성하기 시작했지만 현재이 프로젝트에서 한 하위 도메인에서만 세션이 필요했지만 지금은 차가 필요합니다. 이걸로.

일부 신비한 이유 때문에 다시로드 할 때 세션 변수가 손실됩니다 (이 경우 로그인 세부 정보를 확인한 후 header('Location: /');을 수행 할 때). .

왜 이런 생각입니까? 내가 무슨 일이 일어나고 있는지 알아낼 수 없다 ...

나는 리다이렉션하기 전에 세션 변수 (계정 ID와 login_string)를 반향 해 보았지만 괜찮 았지만 리다이렉션 이후에는 할 수 없었다. 그들을 에코하십시오.

// index.php 
$web_user = new web_user(); 
$web_user->sec_session_start(); 

echo $_SESSION['client_id']; 

$client = $web_user->login_check(); 

// since $client is FALSE 
include('login_post.php'); 

// login_post.php 
$web_user->client_login($email, $password); 

// web_user.php 
$client = new Client(); 
// login is ok 
$_SESSION['client_id'] = $client->getId(); 
return 'login_ok'; 

// back in login_post.php 
header('Location: /'); 

// index.php 
$web_user = new web_user(); 
$web_user->sec_session_start(); 

echo $_SESSION['client_id']; 

결과 : 로그인 전후에 "정의되지 않은 색인 : client_id"(리디렉션). 내가 도메인에 대한 유효 세션을 필요로하기 때문에

$client = $web_user->login_check(); 

다시 FALSE

그래서 ...


조금 명확히하기 위해 ... 나는 또 다른 하위 도메인을 말한다 및 모든 하위 도메인 그러나 문제는 동일한 하위 도메인에 관한 것입니다.

쿠키에 하위 도메인 (로그인)을 지정하면 세션 변수가 작동하여 (로그인 할 수있게하지만) 하위 도메인을 제거하면 login.domain.com이라고 가정 해 보겠습니다. (선행 점을 남겨 둡니다) 그러면 더 이상 작동하지 않습니다 (그리고 로그인 할 수 없습니다).

login.domain.com 

이 세션은 해당 하위 도메인에 대해 유효합니다,하지만 :

은 내가 잘못 아니에요 경우

.domain.com 

이 세션은 도메인과 모든 하위 도메인에 대한 유효합니다 (포함 login.domain.com), 맞습니까?

+0

이'$ domain = 'sub.domain.com';과'header ('Location : /');는 .... 내 생각에 세션은 하위 도메인에서만 유효합니다. – ArtisticPhoenix

+0

죄송합니다, 붙여 넣기 및 수동 writting ... 복사 -1? –

+0

@ArtisticPhoenix 이전에는 도메인과 하위 도메인이 동일한 세션을 갖도록 '$ domain ='.domain.com ';으로 변경했습니다. –

답변

0

문제가 해결되었습니다. 쿠키 도메인에서 선도적 인 점은 더 이상 필요하지 않습니다.감사합니다. https://stackoverflow.com/a/23086139/4067132

저와 .subdomain.domain.com에 대한 오래된 쿠키가있어서 요청이 일치하지 않았습니다.

$domain = 'domain.com'; 

변수는 다시 작업하고있는 세션 :

기존의 쿠키를 삭제하고 쿠키 도메인을 변경 한 후. 이제는 웹 사이트에 모든 하위 도메인에 대해 하나의 쿠키 만 있으면됩니다.

관련 문제