【问题标题】:logout user after successful AJAX callAJAX 调用成功后注销用户
【发布时间】:2020-08-15 11:17:51
【问题描述】:

我有一个如下所示的 ajax 代码,我想在特定时间段不活动后注销页面。下面的代码在文件 mno.php 中(包括 javascript 和 php)。我的登录/注销代码在 mno.php 文件中。

我认为我需要在 A 行 进行更改。我尝试使用{'logout'} 而不是{action:'logout'},但它仍然无法正常工作。我的登录和注销代码在 mno.php 中。

<?php
if(isset($_GET['action'])  && $_GET['action'] == "logout")  {
    unset($_SESSION['admin']);
    header('location: /abc/mno.php.php');
    exit();
}
?>


<script>
jQuery(document).ready(function ($) {

    let lastActivity = <?php echo time(); ?>;  

    let now = <?php echo time(); ?>;

    let logoutAfter = 10;

    let timer = setInterval(function () {
        now++;
        let delta = now - lastActivity;
        console.log(delta);
        if (delta > logoutAfter) {
            clearInterval(timer);
            //DO AJAX REQUEST TO close.php
            $.ajax({
                url: "/abc/mno.php",
                type: 'GET', 
                data: {action:'logout'},           // Line A
                success: function(data){
                console.log(data); // Line B
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    alert(textStatus);
                }
            });
        }
    }, 1000);
});
</script>

问题陈述:

我想知道我需要在 A 行或 php 中进行哪些更改,以便页面在 10 秒不活动或我们设置的任何时间后注销。

编辑 1:我将 console.log(data) 放在 B 行。在控制台上,我得到了登录页面的 HTML,但该页面仍未注销。我的登录页面代码在 mno.php 中。在执行 console.log(data) 时,我在控制台上得到以下信息:

<form action="/abc/mno.php" method="post">
        <div style='width:400px;'>
            <input type="hidden" id="user_login" name="user_login" value="1">
            <fieldset>
                <legend>Login</legend>
                                <div>
                    <label for="user_name">User Name</label>
                    <input type="text" name="user_name">
                </div>
                <div>
                    <label for="user_pass">Password</label>
                    <input type="password" name="user_pass">
                </div>
                <div>
                    <button type="submit">Login</button>
                </div>
            </fieldset>
        </div>
</form>

编辑 2:我已将 /mno.php 替换为 /abc/mno.php

【问题讨论】:

  • 您的 PHP 应该在 AJAX 的单独页面上。
  • 你的意思是,我应该把我的 AJAX 代码放在一个单独的地方?
  • @StackSlave A 行有错误吗?
  • 我总是使用外部 &lt;script src='folder/file.js'&gt;&lt;/script&gt; 将我的 JavaScript 放在我的 &lt;head&gt; 中,然后使用外部文件上的脚本发送到 PHP 页面,该页面使用 echo json_encode($objectHere); 发回数据
  • @StackSlave 我已经编辑了我的问题。我想知道你是否可以看看。

标签: javascript php ajax session logout


【解决方案1】:

由于您在处理响应后使用了 ajax,因此必须将响应返回给 ajax,现在您的代码正在发送回 mno.php 的 html 数据,因为您无法从您的 php 代码重定向。相反,请执行以下操作:

你的 ajax 代码:

 $.ajax({
  url: "test.php",
  type: 'GET',
  data: {
    action: 'logout'
  }, // Line A
  success: function(data) {
  //checking if data coming from php is "success"
    if (data === "success") {
    //to redirect
      window.location.href = "login_page_to_redirect";
    }else{
     alert("error");
   }
  },
  error: function(xhr, status, error) {
    console.log(xhr.responseText);
    console.log(error);
    console.log(status);
    console.log(xhr);
  }
});

你的 php 代码:

if(isset($_GET['action'])  && $_GET['action'] == "logout")  {
    unset($_SESSION['pageadmin']);
   //this will send back to ajax
   echo "success";
  }else{
  echo "error";
  }

【讨论】:

  • 我想知道 AJAX 是否会向 PHP 发送请求?在您的 cmets 中,我可以看到 // this will send back to AJAX // checking if data coming from php is "success"
  • 我的页面将加载,它不会进入 php 代码,因为条件不成立。计时器将运行,如果 delta&gt;logoutAfter 将进行 GET 调用。如果我是对的,请告诉我。
  • 是的,当您的条件满足时,只有 ajax 会被调用,并且我上面发布的 php 代码会运行..您只需要这个或者我误解了您的问题?
  • 我的 PHP 代码和 JS 代码在同一个 PHP 文件中,即 mno.php。当我的页面加载时,它不会进入 PHP 代码,因为条件不成立。首先,它将进入 JS 代码,如果成功,然后 AJAX 将向 PHP 代码发送请求。
  • 您写了 //检查来自 php 的数据是否“成功”,我认为这是不对的。 AJAX 将向 PHP 发送请求。
【解决方案2】:

我尝试了确切的代码,并且在给定的时间之后它工作了。 ajax url 是文件 url 本身(包括 php 和 ajax 调用)。

test.php:

<?php
if(isset($_GET['action'])  && $_GET['action'] == "logout")  {
    echo 'logged out';
}
?>

<script src="js/jquery-min.js"></script>
<script>
jQuery(document).ready(function ($) {

    let lastActivity = <?php echo time(); ?>;  

    let now = <?php echo time(); ?>;

    let logoutAfter = 10;

    let timer = setInterval(function () {
        now++;
        let delta = now - lastActivity;
        console.log(delta);
        if (delta > logoutAfter) {
            clearInterval(timer);
            //DO AJAX REQUEST TO close.php
            $.ajax({
                url: "test.php",
                type: 'GET', 
                data: {action:'logout'},           // Line A
                success: function(data){
                console.log(data); // Line B
                },
                error: function(xhr, status, error) {
                    console.log(xhr.responseText);
                    console.log(error);
                    console.log(status);
                    console.log(xhr);
                }
            });
        }
    }, 1000);
});
</script>

我从 php 中获得了“已注销”以及文件中的其他内容。 所以你应该能够执行你的注销功能。 也许检查您的网址是否正确。

【讨论】:

  • 你知道如何调试 url 吗?我在 B 行之后放置了 console.log(url) 并且出现错误。
  • 网址未定义。
  • 我给你一个机会,你输入了错误的网址。将/ 放在url 的开头会转到目录的根目录。如果文件在同一页面上,则应避免使用它。
  • 也许试试mno.php
  • 好吧,如果控制台发出该消息,则 ajax 调用已成功!并且 url 没有定义,因为它不是局部变量。我认为你的 php 代码有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2015-11-23
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多