如何锁定其他网页

时间:2013-01-03 00:29:27

标签: php jquery ajax

我有一个考试应用程序,用户创建考试时必须通过这些页面:

  • create_session.php
  • QandATable.php
  • indivdiualmarks.php
  • penalty.php
  • complete.php

现在我担心的是用户可以完成其中的一些页面,但是要么放弃创建考试而忽略其他页面,要么他们开始通过上面的某些页面创建考试但是之后能够通过输入即将出现的其他页面的网址,返回上一页或上一页或跳过页面。

所以我的问题是,有没有办法可以阻止用户跳过页面或返回上一页?换句话说,他们必须按照确切的顺序按照上面五页的确切步骤来创建考试。

例如,如果用户在QandATable.php page上,他们无法返回到create_session.php页面,或者在QandATable.php成功提交之前,他们无法跳到其他页面?换句话说,锁定除当前页面之外的其他页面。用户访问complete.php页面后,检查即告完成,create_session.php可以从锁定中移除,因为这是第一页。

如果用户放弃了诸如individualmarks.php之类的页面,并且用户直接返回到indivdualmarks.php页面,那就没问题,但如果他们试图访问另一个页面,我正在考虑发送提示框或类似的陈述:

  

您目前正在考试中继续考试   创建当前考试点击此链接(链接到当前页面   用户在)

     

如果您想创建新考试,请点击此链接(链接   到create_session.php页面。)。

我知道我要问的不是很简单,但我不希望用户搞砸创建考试,除非他们按照正确的顺序执行每个步骤(每个页面),这样就不会弄乱任何数据。有没有人有一个关于如何实现这一目标的简单样本?

我正在使用IE,Chrome。 Safari,Firefox和Opera

由于

更新

<?php

session_start();

?>

    <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="stepsStyle.css">
        <title>Follow Steps</title>

        <script type="text/javascript">

//if user selects "Create New Assessment" Link, then use jquery/ajax below
//code below will access removesession.php where it will remove exam details which will be overwritten

$(function() {
    var link = $("#createLink");

    link.click(function() {
        $.ajax({
           url: "removesession.php",
           async: false,
           type: "POST",
           success: function() {
                window.location.href = link.attr("href");
           }
         });

         //cancels the links true action of navigation
         return false;
    });
);

</script>

        </head>
        <body>

<?php

$steps = array('create_session.php', 'QandATable.php', 'individualmarks.php', 'penalty.php', 'complete.php');

$latestStep = $_SESSION['latestStep'];
// Track $latestStep in either a session variable or the DB and retrieve accordingly
// $currentStep will be dependent upon the page you're on

$currentIdx = array_search($currentStep, $steps);
$latestIdx = array_search($latestStep, $steps);

if ($currentIdx - $latestIdx > 1 ) {
    ?>

//set up a div box to display message on wether use should contine or not
<div class="boxed">
  You already have an exam currently in creation, to continue with creating the current exam click on this link: <br/><a href="">Continue with Current Assessment</a>
<br/>
If you want to create a new exam then please click on this link: <br/><a href="create_session.php" id="createLink">Create New Assessment</a>
</div>

<?

} else {
    // let the user do the step
}

?>

有关上述代码的几个问题:

  1. $currentStep变量应该等于什么?
  2. 如果用户想继续参加当前考试,如何链接到当前页面?
  3. 我应该将else语句留空以让用户执行此步骤吗?

2 个答案:

答案 0 :(得分:3)

通过默默无闻的安全确实是一个天真的计划:你应该总是假设你的网址是公开的。在这里,您需要一个类似向导的界面,该界面又是finite-state machine。假设您的系统已经有用户,您需要找到一个工作流引擎(或FSM实现,​​或者自己开发一个简单的实现)并跟踪每个流中的用户提交。

在每个页面的开头,您必须验证用户的位置,即您必须说明当前状态中的用户是否可以访问所请求的资源。如果他不能只是重定向他,否则显示请求的页面。

顺便说一下,您似乎正在从头开始构建应用程序。快速通道使用框架,例如CakePHP。我建议使用Cake,因为我刚刚发现this nice plugin(我自己从未使用它,但API非常好,而Cake本身非常适合学习目的)

答案 1 :(得分:1)

我会跟踪变量中的最后一个完成状态,以及列表中的工作流程。在每个页面上,检查上次完成的状态是否大于或等于先前所需的步骤。这假设您的工作流程完全是线性的。像这样:

$steps = array('create', 'table', 'marks', 'penalty', 'complete');

// Track $latestStep in either a session variable or the DB and retrieve accordingly
// $currentStep will be dependent upon the page you're on

$currentIdx = array_search($currentStep, $steps);
$latestIdx = array_search($latestStep, $steps);

if ($currentIdx - $latestIdx > 1 ) {
    // show error message
} else {
    // let the user do the step
}

修改:回答问题:

$ currentStep变量应该等于什么?

这应该等于你所在的页面并匹配$步骤中的值;看起来它应该是当前页面的文件名。

如果用户想继续参加当前考试,如何链接到当前页面?

如果用户在页面上,听起来好像在询问如何重定向到正确的步骤。下一步应该是$steps[$latestIdx + 1],例如最后一步之后的步骤。

我应该将else语句留空以让用户执行此步骤吗?

else语句应包含您希望用户执行的所有代码。或者,如果您要将其外部化,则应该使用返回值,如果可以执行该步骤则返回1,否则返回0。然后在每个页面上,您将调用此函数,并根据返回值显示页面或显示错误。