【发布时间】:2018-08-11 14:28:40
【问题描述】:
我使用 Angular 6 作为前端,使用以下 PHP 代码(sn-p)作为后端:
session_start();
switch ($_SERVER["REQUEST_METHOD"]) {
case "GET":
...
break;
case "POST":
if (isMatch("/user/login")) {
if () {
// if un & pw is ok
... // get the permission from db..., then
$_SESSION['sid'] = session_id();
$_SESSION['userName'] = $userName;
$_SESSION['permissions'] = $permissions;
sendResponse($response);
} else {
// if not
sendResponse($response);
}
}
if (isMatch("/file/upload")) {
if (isset($_SESSION['sid'])) {
// upload...
sendResponse($response);
} else {
// no permission
sendResponse($response);
}
}
...
break;
}
前端的端点:
postLogIn(user: LoggingInUser): Observable<any> {
return this.http.post(`${environment.baseServerHref}/${ENDPOINTS.LOG_IN}`, user);
}
postFiles(formData: FormData): Observable<any> {
return this.http.request(
new HttpRequest('POST', `${environment.baseServerHref}/${ENDPOINTS.UPLOAD_FILE}`, formData, {reportProgress: true})
);
}
不幸的是 $_SESSION 丢失了值,所以当我在验证(成功)后尝试使用另一个请求上传文件时,$_SESSION 为空。
我怎样才能达到我想要的?
更新:
这是一个非常简单的例子:
session_start();
header("Access-Control-Allow-Origin: {$_SERVER["HTTP_ORIGIN"]}");
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
} else {
$_SESSION['count']++;
}
echo json_encode(array('sid' => session_id(), 'count' => $_SESSION['count']));
响应(我发送了 3 次请求):
{"sid":"nttlcglqhpufuuu1a8vvv43uo9","count":0}
{"sid":"i4lip1deia00f9hb51u20dv7rn","count":0}
{"sid":"p5gdh7315a9gvgsbsm2kt4lvts","count":0}
【问题讨论】:
-
这是正确的
$_SESSION['userName'] = $userName; $_SESSION['permissions'] = $permissions;吗? IE。这些变量是否有值(它们不在您的代码中) -
你能说明
sendResponse在做什么吗?它是否使用exit/die终止进程?在这种情况下,session_write_close可能不会被调用。见stackoverflow.com/a/14870204/7362396 -
另外,您是否确认 SESSION cookie 已持久化/包含在您的前端代码中的下一个请求中?
-
我更新了上面的问题。
-
我的意思是打开你的浏览器 DevTools“网络”监视器:检查请求的响应标头:应该有一个
Set-Cookie标头可能带有PHPSESSID。这是否包含在您的下一个请求请求标头中,为Cookie?