【发布时间】:2013-07-03 23:52:18
【问题描述】:
当从 javascript 对 php 文件进行异步调用时,如何确保 php $_session 信息(我相信这是基于 cookie)与异步请求一起发送?
听说cookie信息随所有HTTP请求一起发送,但我发现jquery的$.get()和$.post()请求无法让接收的PHP文件读取$_session信息。
接收php文件试图以正常方式读取$_session信息:
session_start();
if(isset($_SESSION['user'])){
.....
如果在网络浏览器中直接访问接收的php文件,则可以访问会话信息。
谢谢!
* 更新*
我发现失败的是 session_start() 命令。该命令会导致以下文件返回“0”而不是预期的“无可用会话”响应。
whois.php:
$s = session_start();
if($s){
if(isset($_SESSION['user'])){
if(isset($_POST['name'])){
echo $_SESSION['user']." ".$_POST['name'];
}elseif(isset($_GET['name'])){
echo $_SESSION['user']." ".$_GET['name'];
}
}else{
echo 'no user specified';
}
}else{
echo 'no session available';
}
为了彻底起见,我通过直接 URL 导航到 Web 浏览器来测试上述 php 文件,并访问 php 会话并输出正确的响应。我想知道为什么它不能异步工作......
根据 Pekka 的请求,这里是发出异步请求的 php 文件:
<?PHP
session_start();
if(isset($_GET['user'])){
$_SESSION['user'] = $_GET['user'];
}
?>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$("#response").html('---');
$("#form").submit(function(){
var formData = $(this).serialize();
$.post("whois.php",formData,function(data){
$("#response").html(data);
});
return false;
});
});
</script>
</head>
<body>
<form id="form">
<input name="name" type="text"/>
<input name="submit" type="submit"/>
</form>
<div id="response">
</div>
</body>
</html>
【问题讨论】:
-
这是不正确的。当您进行 ajax 调用时,会话 ID 与请求一起在 cookie 中发送,并且接收请求的 php 文件能够读取会话数据。如果没有,那么你做错了什么,比如只让你的cookies http(我认为)。
-
是的,这应该可以。会话 cookie 应该在每个 Ajax 请求中携带。
-
这就是我一直在阅读的内容,它应该可以工作......但它没有。是否有任何默认的服务器设置或默认的 PHP 设置可以解决问题?我已经在基于 Apache 和 IIS 的本地主机上尝试过,但没有运气。
-
你能显示更多代码吗,例如你是如何发出 Ajax 请求的?
-
@Twisted1919:在 JS 脚本中根本无法读取 httponly cookie。它们仍将在所有 ajax 请求的 http 标头中发送。如果不是这样,ajax 将毫无用处,因为您将无法维护许多站点的登录。