PHP 会话不持久 AJAX
PHP session not persistent with AJAX
我正在制作一个需要用户登录的网站(本地开发);我使用 php-login.net framework 作为起点,让我的代码与 MySQL 对话并创建会话就好了。
关于 php 个会话和 ajax,我几乎每个 SO question 都经历过;但我仍然无法让我的代码按我想要的方式工作。
现在,我正在使用 ajax 在用户成功登录后调用其他一些 php 脚本,但它无法正常工作。在 firefox 中,清除所有 cookie、历史记录等后,看起来 ajax 调用未维护会话变量。但是,如果我 log-out 然后重新登录,会话变量似乎在 ajax.
之间正确传递
例如:
在我的 logged_in.php 脚本中,我使用 ajax 调用另一个脚本:view_samples.php.
logged_in.php
<script type="text/javascript" src="/js/loggedInButtons.js" > </script> <!-- all our ajax calls are here -->
<?php
// debug some variables
print_r($_SESSION);
echo "<br>" . session_id() . "<br>";
// if logged in
if ($_SESSION['logged'] == 1) {
?>
<button class='btn btn-primary' id="view_samples"> View samples</button> <!-- calls view_samples.php -->
<div id="ajaxResult"></div> <!-- results of ajax calls go here -->
<?php
}
?>
loggedInButtons.js
$(document).ready(function(){
$("#view_samples").click(function(){
$.ajax({
url: "view_samples.php",
cache: false,
success: function(result){
$("#ajaxResult").html(result);
}
});
});
}
view_samples.php
<?php
session_start():
// debug session
print_r($_SESSION);
echo "<br>" . session_id() . "<br>";
if ($_SESSION['logged'] == 1) {
// do something because we are properly logged in
} else {
echo "not logged in!";
}
?>
当我使用以前没有登录过的浏览器登录时,我看到它设置了一个会话 ID X;但是当按下按钮并进行 ajax 调用时,我看到一个新的会话 ID Y。然后我注销并重新登录,看到我的会话 ID 是 Y(在 ajax 之前)并且我的会话 ID 是 Y 当我点击按钮时(在 ajax 之后)。
我还注意到,如果我在不按查看示例按钮的情况下继续登录和注销,则每次都会生成一个新的会话 ID。但是,一旦我按下按钮,就会创建一个全新的会话 ID,如果我注销然后重新登录,它似乎总是设置的。
我错过了什么?确保创建的第一个会话在整个 ajax 调用期间保持不变的正确方法是什么?我应该 POST 被调用脚本的会话 ID 吗?
这就是我解决问题的方法(因为 Freaktor 上面的评论没有解决问题)- 我通过 AJAX 手动传递会话 ID,然后在新的 PHP 中设置它脚本。 我想知道是否有人可以对此 的安全性发表评论(因为我不完全确定这一切是如何工作的)?
and this post 很有帮助。
logged_in.php
<script>var session_id = '<?php echo session_id();?>';</script> <!-- store our session ID so that we can pass it through ajax -->
<script type="text/javascript" src="/js/loggedInButtons.js" > </script> <!-- all our ajax calls are here -->
<?php
// debug some variables
echo "<br>" . session_id() . "<br>";
// if logged in
if ($_SESSION['logged'] == 1) {
?>
<button class='btn btn-primary' id="view_samples"> View samples</button> <!-- calls view_samples.php -->
<div id="ajaxResult"></div> <!-- results of ajax calls go here -->
<?php
}
?>
loggedInButton.js
var data = {func:'getData1',session_id:session_id}; // manually send the session ID through ajax
$(document).ready(function(){
$("#view_samples").click(function(){
$.ajax({
type: "POST",
data: data,
url: "view_samples.php",
success: function(result){
$("#ajaxResult").html(result);
}
});
});
}
view_samples.php
<?php
session_id($_POST['session_id']); // get the session ID sent by AJAX and set it
session_start():
// debug session
print_r($_SESSION);
echo "<br>" . session_id() . "<br>";
if ($_SESSION['logged'] == 1) {
// do something because we are properly logged in
} else {
echo "not logged in!";
}
?>
我正在制作一个需要用户登录的网站(本地开发);我使用 php-login.net framework 作为起点,让我的代码与 MySQL 对话并创建会话就好了。
关于 php 个会话和 ajax,我几乎每个 SO question 都经历过;但我仍然无法让我的代码按我想要的方式工作。
现在,我正在使用 ajax 在用户成功登录后调用其他一些 php 脚本,但它无法正常工作。在 firefox 中,清除所有 cookie、历史记录等后,看起来 ajax 调用未维护会话变量。但是,如果我 log-out 然后重新登录,会话变量似乎在 ajax.
之间正确传递例如:
在我的 logged_in.php 脚本中,我使用 ajax 调用另一个脚本:view_samples.php.
logged_in.php
<script type="text/javascript" src="/js/loggedInButtons.js" > </script> <!-- all our ajax calls are here -->
<?php
// debug some variables
print_r($_SESSION);
echo "<br>" . session_id() . "<br>";
// if logged in
if ($_SESSION['logged'] == 1) {
?>
<button class='btn btn-primary' id="view_samples"> View samples</button> <!-- calls view_samples.php -->
<div id="ajaxResult"></div> <!-- results of ajax calls go here -->
<?php
}
?>
loggedInButtons.js
$(document).ready(function(){
$("#view_samples").click(function(){
$.ajax({
url: "view_samples.php",
cache: false,
success: function(result){
$("#ajaxResult").html(result);
}
});
});
}
view_samples.php
<?php
session_start():
// debug session
print_r($_SESSION);
echo "<br>" . session_id() . "<br>";
if ($_SESSION['logged'] == 1) {
// do something because we are properly logged in
} else {
echo "not logged in!";
}
?>
当我使用以前没有登录过的浏览器登录时,我看到它设置了一个会话 ID X;但是当按下按钮并进行 ajax 调用时,我看到一个新的会话 ID Y。然后我注销并重新登录,看到我的会话 ID 是 Y(在 ajax 之前)并且我的会话 ID 是 Y 当我点击按钮时(在 ajax 之后)。
我还注意到,如果我在不按查看示例按钮的情况下继续登录和注销,则每次都会生成一个新的会话 ID。但是,一旦我按下按钮,就会创建一个全新的会话 ID,如果我注销然后重新登录,它似乎总是设置的。
我错过了什么?确保创建的第一个会话在整个 ajax 调用期间保持不变的正确方法是什么?我应该 POST 被调用脚本的会话 ID 吗?
这就是我解决问题的方法(因为 Freaktor 上面的评论没有解决问题)- 我通过 AJAX 手动传递会话 ID,然后在新的 PHP 中设置它脚本。 我想知道是否有人可以对此 的安全性发表评论(因为我不完全确定这一切是如何工作的)?
logged_in.php
<script>var session_id = '<?php echo session_id();?>';</script> <!-- store our session ID so that we can pass it through ajax -->
<script type="text/javascript" src="/js/loggedInButtons.js" > </script> <!-- all our ajax calls are here -->
<?php
// debug some variables
echo "<br>" . session_id() . "<br>";
// if logged in
if ($_SESSION['logged'] == 1) {
?>
<button class='btn btn-primary' id="view_samples"> View samples</button> <!-- calls view_samples.php -->
<div id="ajaxResult"></div> <!-- results of ajax calls go here -->
<?php
}
?>
loggedInButton.js
var data = {func:'getData1',session_id:session_id}; // manually send the session ID through ajax
$(document).ready(function(){
$("#view_samples").click(function(){
$.ajax({
type: "POST",
data: data,
url: "view_samples.php",
success: function(result){
$("#ajaxResult").html(result);
}
});
});
}
view_samples.php
<?php
session_id($_POST['session_id']); // get the session ID sent by AJAX and set it
session_start():
// debug session
print_r($_SESSION);
echo "<br>" . session_id() . "<br>";
if ($_SESSION['logged'] == 1) {
// do something because we are properly logged in
} else {
echo "not logged in!";
}
?>