我想建立一个在线测验网站。
假设考试在上午10:00开始,学生在上午9:45登录考试。每当学生点击“参加考试”按钮时,他/她就无法访问试卷,因为考试时间是上午10:00,距离考试开始还有15分钟。
现在我想放一些Javascript或PHP代码,它将禁止学生提前考试,如果学生提前来了,它将显示一个秒表,其中显示考试时间之前的剩余时间,当当前时间等于考试时间时,他/她将被直接重定向到试卷页面。
发布于 2011-11-21 10:11:47
任何客户端都是可破解的。坚持纯服务器端。
为什么不是一个非常简单的PHP页面,当加载时,检查时间并适当地重定向?
test.php
if ( now() < $test_start_time)
{
header('Location: come_back_later.php');
Die;
}
// test page goes here
发布于 2011-11-21 09:44:50
我不相信JavaScript,因为用户可以在他/她的浏览器上禁用Javascript来绕过安全保护。你应该考虑一些服务器端的方法,也许是一些在特定的日期和时间发布你的网站的脚本。
您没有指定您的操作系统和web服务器,但是无论您使用的是Linux/Apache还是Windows/IIS,从批处理脚本执行类似的操作都不会太困难。
更新
为你的应用程序准备两个登录页面,其中一个页面的主体内容类似于this app will be available starting at 10 AM
,并创建一个任务(Control Panel-> Admin Tools -> Task Scheduler
),它将在给定日期的上午10点用真实的登录页面替换这个临时登录页面。这足够简单了吗?
发布于 2011-11-21 10:29:18
在您想要禁止提前访问的每个PHP脚本的顶部,您可能希望包括如下内容:
if (mktime(12, 0, 0, 1, 1, 2012) > time()) {
require 'waiting.php';
die;
}
您应该检查mktime() PHP documentation以了解如何指定您希望用作阈值的日期和时间。
当当前时间小于2011年1月1日中午时,上面的示例将include waiting.php
脚本。die
函数阻止PHP加载页面中的任何其他内容,从而有效地阻止访问。当当前时间超过您的mktime()
时间时,将不会触发include
和die
调用,页面将正常加载。
请注意系统时间。 mktime()
将使用系统时间,该时间可能与要运行测试的时区不同。在调用mktime()
之前,您应该使用date_default_timezone_set()设置时区。
例如:
date_default_timezone_set('America/Los_Angeles');
最后。正如在其他评论中提到的,JavaScript检测本身并不可靠,这不仅是因为它很容易被规避,还因为不能保证用户的时间与服务器的时间相同。
假设您想要在超时完成后刷新页面。我将在waiting.php
中包含以下内容:
<?php
$miliseconds_remaining = (mktime(12, 0, 0, 1, 1, 2011) - time()) * 1000;
?>
<script type="text/javascript">
window.setTimeout(function() {
window.reload(true);
}, <?php echo $miliseconds_remaining;?>);
</script>
这将强制页面在时间到期时自动刷新,并忽略浏览器的缓存。此解决方案将刷新页面,而不考虑服务器和用户之间的时区差异。
https://stackoverflow.com/questions/8206380
复制相似问题