如何锁定其他网页
我有一个考试应用程序供用户创建考试,他们必须通过这些网页:
现在我担心的是用户可以完成其中的一些页面,但之后要么放弃创建考试,要么忽略其他页面,要么开始通过上面的一些页面创建考试,然后能够重新开始前一页或上一页或通过输入即将提供的其他页面的URL来跳过页面。
所以我的问题是,有什么方法可以阻止用户跳过页面或返回到上一页? 换句话说,他们必须按照确切的顺序完成上面五页的准确步骤来创建考试。
例如,如果用户在QandATable.php page
,他们不能回到create_session.php页面,或者直到成功提交QandATable.php
才能跳到其他页面。 换句话说,锁定除当前页面之外的其他页面。 一旦用户访问了complete.php
页面,考试就完成了,并且create_session.php
可以从锁定中移除,因为这是第一页。
如果用户放弃了诸如individualmarks.php之类的页面,并且用户直接返回到individualdualmarks.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
}
?>
有几个关于上述代码的问题:
$currentStep
变量应该等于什么? 我会跟踪变量中的最后一个完成状态,以及列表中的工作流程。 在每一页上,检查最后完成的状态是否大于或等于先前所需的步骤。 这假设你的工作流程是完全线性的。 像这样的东西:
$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的形式匹配值; 看起来应该是当前页面的文件名。
如果用户想要继续进行当前考试,该如何链接到当前页面?
听起来好像你在问如何重定向到正确的步骤,如果用户在页面上。 下一步应该是$steps[$latestIdx + 1]
,例如最后一步之后的步骤。
我应该将空白语句留空以让用户执行该步骤吗?
else语句应该包含您希望用户执行的所有代码。 或者,如果你正在外部化这个,你应该使用返回值,如果他们可以做这个步骤返回1,如果他们不能做到则返回0。 然后在每一页上,您都会调用此函数,并根据返回值显示页面或显示错误。
通过默默无闻的安全确实是一个天真的计划:你应该始终假设你的URL是公开的。 在这里你需要一个类似向导的界面,而界面又是一个有限状态机器。 假设你的系统已经有了用户,你需要找到一个工作流引擎(或者FSM实现,或者自己开发一个简单的工具),并且跟踪每个流程中的用户提交。
在每个页面的开始处,您必须验证用户的位置,即您必须说明处于当前状态的用户是否可以访问请求的资源。 如果他不能只是重定向他,否则显示请求的页面。
顺便说一句,看来你是从头开始构建你的应用程序。 快速轨道正在使用一个框架,例如CakePHP。 我建议Cake是因为我刚刚发现了这个漂亮的插件(我自己从来没有用过,但API非常好,Cake本身对于学习目的来说非常棒)
链接地址: http://www.djcxy.com/p/67943.html