죄송합니다. 좋은 것을 작성하는 것은 항상 어렵습니다.세션 변수가 액세스하기 전에 세션을 시작한 경우에도 세션 변수가 손실 됨
함수를 사용하여 세션을 시작하므로 모든 것을 선언/구성 할 수 있습니다.
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), 맞습니까?
이'$ domain = 'sub.domain.com';과'header ('Location : /');는 .... 내 생각에 세션은 하위 도메인에서만 유효합니다. – ArtisticPhoenix
죄송합니다, 붙여 넣기 및 수동 writting ... 복사 -1? –
@ArtisticPhoenix 이전에는 도메인과 하위 도메인이 동일한 세션을 갖도록 '$ domain ='.domain.com ';으로 변경했습니다. –