【问题标题】:PHP $_SESSION always loses the values, what's wrong?PHP $_SESSION 总是丢失值,怎么了?
【发布时间】: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

标签: php session


【解决方案1】:

解决方案

我检查了这些人在我的问题下用 cmets 写的。

解决方案是...

-在 PHP 方面:

header('Access-Control-Allow-Credentials: true');

-在 Angular 方面:

return this.http.post(URL, user, {withCredentials: true});

withCredentials 选项应设置为 true。

谢谢大家:)

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2023-02-11
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多