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