Ajax 请求和会话

Posted

技术标签:

【中文标题】Ajax 请求和会话【英文标题】:Ajax request and SESSION 【发布时间】:2016-05-05 02:54:54 【问题描述】:

我有一个用户填写的表格,然后按“提交”按钮进行注册。

我想在提交表单之前向用户预览数据,所以我使用 AJAX 来执行此操作。程序如下:

1) 用户点击“提交”按钮(例如registration.php

2) JS 脚本,阻止默认操作(即提交)并通过 AJAX (registrationAJAX.php) 调用另一个 PHP 脚本,即:

a) 执行一些数据库更改

b) 将一些变量存储在 $_SESSION 数组中

$_SESSION['userID'] = $uID;
$_SESSION['userEmailAddress'] = $email;
$_SESSION['hash'] = $hash;

c) json_encodes 如下数组:

$results = array(

                   'result'  => 'success',
                   'message' => 'registration was successful' 

                );

echo json_encode($results);

d) 然后退出

exit();

3) 回到 JS 脚本并在 AJAX success 上,我检查结果是否为“成功”,然后将用户重定向到发送自动电子邮件以进行帐户验证的脚本:

$.ajax(
    type: "POST",
    url: "js/ajax/registrationAJAX.php",
    data: form data...,
    cache: false,
    success: function(output)
         var outputJSON = $.parseJSON(output);
         var status = outputJSON.result;

         if(status == 'success')
         
             location.href = "https://domain.com/verify.php";
         
    
);

verify.php 脚本必须有权访问 $_SESSION 变量才能正确执行。

 //the code will only executed if the $_SESSION['hash'] is set:
 if(isset($_SESSION['hash']))
 
     //SEND EMAIL ACTIVATION EMAIL TO USER

     //INFORM THE DATABASE THAT THE EMAIL IS SENT
 

有时我看到我的一些用户没有收到激活电子邮件。如果 verify.php 脚本没有我在 registrationAJAX.php 期间存储的 $_SESSION 变量然后失败(如上面的代码所示),则会发生这种情况。

问题:

1) 变量是否有可能延迟存储在 $_SESSION 中并且重定向到 verify.php 是在没有 $_SESSION 变量的情况下执行的?

2) exit() 命令是否会导致问题?

【问题讨论】:

唯一想到的是 cookie 可能会被禁用,我猜这会导致会话完全丢失。 verify.php 代码顶部是否有session_start() 更有可能是用户在 ajax 请求启动后的某个时间关闭浏览器,但在它完成之前,因此永远不会进行重定向。为什么不发送电子邮件至registrationAJAX.php 另外,请确保在处理 ajax 请求时显示一些视觉反馈(例如微调器微调器) @Steve 这需要以下之一:慢速服务器、慢速互联网连接或非常精确的时间。 【参考方案1】:

您应该考虑转向 OAuth 身份验证以避免 cookie 被禁用的问题:

http://www.sitepoint.com/creating-a-php-oauth-server/

问候,

【讨论】:

以上是关于Ajax 请求和会话的主要内容,如果未能解决你的问题,请参考以下文章

JSF/PrimeFaces ajax 请求上的会话超时和 ViewExpiredException 处理

在 AJAX 请求上为空 $_SESSION 超全局,但保留会话 ID

ajax请求后php会话值被擦除

Internet Explorer 9 AJAX 请求上没有会话 Cookie

Laravel 5 异步 AJAX 请求导致会话问题

会话不适用于 ajaxRequest [如何使用会话变量计算 ajax 请求]