-3

我在页面上有日期、日期和时间等链接。如果有人点击“日期”,我想开始一个会话。然后以同样的方式单击“日”,上一个会话停止并创建一个新会话。这可能吗?

4

1 回答 1

1

我不确定您为什么要为此使用会话,但是是的-使用 AJAX 是可能的。

您定义了两个链接,我们称它们为 start 和 stop 例如:

<a id="start">Start</a>
<a id="stop">Stop</a>

然后,您使用 Javascript(此示例将使用jQuery 库)向后端处理程序发出请求,该处理程序将适当地调用session_start()session_stop()。如果以后必须对其进行某些工作,您可以(可选地)在用户停止会话时对其进行序列化。

首先是一个 AJAX 请求的例子。在页面中,您要建立事件以调用通用函数来发出异步请求以启动或结束用户会话。我们通过创建一个匿名函数来做到这一点,该函数将在 DOM 准备好后运行:

<script>
$(document).ready(function() { 
    // Make the request to start or stop a session
    function asyncSessionMolester(uri, val) {
    $.ajax({
        url: uri
        type: 'post',
        dataType: "json",
        cache: false,
        data: {
            'action':session,
            'value':val
        },
        success: function(remoteResponse, textStatus) {
           alert('Session now in mode ' + toggle);
           // do other stuff you want to do on success
        },
        error: function(xhr, desc, err) {
            // There is a lot more data in xhr, this just shows what the server
            // wrote to the browser in the console for debugging.
            // Handle failure here
            console.log(xhr.textResponse);
        }
    });

    // now, our events:

    $('#start').click(function() { 
        asyncSessionMolestor('/ajax.php', 'start');
    }); 

    $('#stop').click(function() {
        asyncSessionMolestor('/ajax.php', 'stop');
    });
});
</script>

现在,您需要创建一些 PHP/ajax.php并执行以下操作:

  • 如果会话已建立,请确保用户有权请求它
  • 检查HTTP_X_REQUESTED_WITH标头,如果不存在,则有人通过浏览器直接访问它(如果是,则退出)
  • 检查您的 POST 数据中的actionvalue。如果行动是session那么switch()的价值。如果start,则开始会话。如果stop然后停止会话。
  • 发回 JSON 响应,您可以在 ajax 调用中检查该响应

如果您需要保存会话以供以后分析或工作电话serialize($_SESSION),甚至json_encode($_SESSION)在销毁它之前。

注意事项:

  • 必须正确处理成功。用户需要知道他们不再有会话。也许是成功的重定向。您还应该正确处理故障。我只举了一个粗略的例子。

  • 在启动会话之前,您不得在启动会话的代码中打印任何内容。

  • 您可能不想像现在这样使用会话,但您询问是否可能,并且确实如此。

  • 代码未经测试,仅作为示例给出。

  • 此示例中未显示任何安全性。至少你需要某种 CSRF 保护,当然还要清理你的输入。

编辑

如果您希望根据状态启动/停止相同的链接,您可以设置一个变量来跟踪它,例如:

<script>
$(document).ready(function() { 
    var state = false;

    ... ajax stuff as above

    $('#date').click(function() { 
       switch(state) {
           case true:
              // We successfully created or recreated a session
              asyncSessionMolester('/ajax.php', 'stop');
              break;
           case false:
              // User has not yet created a session
              asyncSessionMolester('/ajax.php', 'start');
              break;
       }
    });
});
</script>

您将只有一个链接,其 ID 为date. 只要确保 AJAX 函数是更新state变量的函数,这取决于调用的成功与否。请记住,它是异步的——您可能希望阻止用户点击快乐。

这应该会让你朝着你想去的方向前进,或者可能说明为什么这可能不是一个好主意。但是,这是实现它的一种方法。

于 2012-10-08T23:43:22.850 回答