`

表单和头部缓存指令:防止表单内容被清空

阅读更多
1 客户端验证

PHP代码
我们可以使用JavaScript在客户端来校验表单内容,如果数据正确才允许提交到服务器端, 这是Web开发中最常见的方法。利用客户端验证的好处是用户反馈快,无须直接到服务器请求信息后再下载HTML页。大多数验证是放在表单的 "onSubmit"事件中,当JavaScript处理表单验证,用户试图递交表单,则立即返回布尔值False,浏览器也不会进行表单提交,方便用户 立即纠正错误,因为校验动作都在客户端,从而减小了服务器端的负荷。其缺点是,客户端浏览器如IE、Firefox,它们对所支持的JavaScript 脚本解释并不完全相同,在细节上彼此也有些差异。此外,一些用户为了安全,在浏览器端禁止了对JavaScript的支持,或者根本就是恶意的关闭,这样 客户端浏览器就完全不理会客户端验证,为避免这个安全问题,所以仍需要在服务器端进行再次数据验证。

2服务器验证

PHP代码
使用服务器端数据验证,是利用PHP脚本来处理表单数据。与客户端验证相比,使用服务器验证的优点在于:它更安全,与所有浏览器无缝对接;缺点是代价稍高,用户反馈慢、增加了服务器负荷。
使用服务器端验证另一大的优势是,你可以用PHP对校验规则进行任意的修改,利用PHP的多种函数和灵活特点,可以很方便更改校验的数据类型、长度,以及检查文本框范围内的号码等。
另外,如果用PHP连接MySQL数据库才能验证用户名是否存在,这种情况下,根本不可能使用客户端脚本。
3避免表单重复提交

用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。
1.使用客户端脚本提到客户端脚本,经常使用的是JavaScript进行常规输入验证。在下面的例子中,我们使用它处理表单的重复提交问题,请看下面的代码:



XML/HTML代码
<form method="post" name="register" action="test.php" enctype="multipart/form-data">
<input name="text" type="text" id="text" />
<input name="cont" value="提交" type="button" FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'">正在提交,请等待...';document.register.cont.disabled=true; document.the_form.submit();">
</form>
当用户单击“提交”按钮后,该按钮将变为灰色不可用状态

上面的例子中使用OnClick事件检测用户的提交状态,如果单击了“提交”按钮,该按钮立即置为失效状态,用户不能单击按钮再次提交。
还有一个方法,也是利用JavaScript的功能,但是使用的是OnSubmit()方法,如果已经提交过一次表单,将立即弹出对话框,



JavaScript代码
<script language="javascript">
<!--
var submitcount=0;
function submitOnce (form){
if (submitcount == 0){
submitcount++;
return true;
} else{
alert("正在操作,请不要重复提交,谢谢!");
return false;
}
}
//-->
</script>

<form name="the_form" method="post" action="" >
<input name="text" type="text" id="text" />
<input name="cont" value="提交" type="submit">
</form>
如果用户已经单击“提交”按钮,该脚本会自动记录当前的状态,并将submitcount变量自加1,当用户试图再次提交时,脚本判断submitcount变量值非零,提示用户已经提交,从而避免重复提交表单。

2.使用Cookie处理使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单,请见下面的代码



PHP代码
<?php
if(isset($_POST['go'])){
setcookie("tempcookie","",time()+30);
header("Location:".$_SERVER[PHP_SELF]);
exit();
}
if(isset($_COOKIE["tempcookie"])){
setcookie("tempcookie","",0);
echo "您已经提交过表单";
}
?>
如果客户端禁止了Cookie,该方法将不起任何作用,这点请注意

3. 使用Session处理利用PHP的Session功能,也能避免重复提交表单。Session保存在服务器端,在PHP运行过程中可以改变 Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提 交,请见如下代码:

PHP代码
<?php
session_start();
//根据当前SESSION生成随机数
$code = mt_rand(0,1000000);
$_SESSION['code'] = $code;
?>
在页面表单上将随机数作为隐藏值进行传递,代码如下:

<input type="hidden" name="originator" value="<?=$code?>">

在接收页面的PHP代码如下:

PHP代码
<?php
session_start();
if(isset($_POST['originator'])) {
if($_POST['originator'] == $_SESSION['code']){
// 处理该表单的语句,省略
}else{
echo ‘请不要刷新本页面或重复提交表单!’;
}
}
?>
4.使用header函数转向除了上面的方法之外,还有一个更简单的方法,那就是当用户提交表单,服务器端处理后立即转向其他的页面,代码如下所示。

PHP代码
if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
//处理数据,如插入数据后,立即转向到其他页面
header('location:submits_success.php');
}
这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。

4表单过期的处理

在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现。
1.使用header头设置缓存控制头Cache-control。
header('Cache-control: private, must-revalidate');
//支持页面回跳

2.使用session_cache_limiter方法。
session_cache_limiter('private, must-revalidate'); //要写在session_start方法之前
下面的代码片断可以防止用户填写表单的时候,单击“提交”按钮返回时,刚刚在表单上填写的内容不会被清除:
session_cache_limiter('nocache');
session_cache_limiter('private');
session_cache_limiter('public');
session_start();
//以下是表单内容,这样在用户返回该表单时,已经填写的内容不会被清空
将该段代码贴到所要应用的脚本顶部即可。
Cache-Control消息头域说明Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
请 求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh和only-if-cached,响应 消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、 proxy-revalidate和max-age。各个消息中的指令含义如表5-3所示。
表5-3


缓存指令


说 明
public 指示响应可被任何缓存区缓存
private 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效
no-cache 指示请求或响应消息不能缓存
no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存
max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应
min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应
max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息

有关Session和Cookie的介绍,详细内容请参阅第10章“PHP会话管理”。


5判断表单动作的技巧

表单可以通过同一个程序来分配应该要处理的动作,在表单中有不同的逻辑,要怎么判别使用者按下的按钮内容不过是个小问题。
其实只要通过提交按钮的name 就可以知道了,表单在提交出去的时候,只有按下的submit类型的按钮才会被送到表单数组去,所以只要判断按钮的值就可以知道使用者按下哪一个按钮,以如下表单为例:

XML/HTML代码
<FORM method="POST" Action=test.php>
<input type=submit name="btn" value="a">
<input type=submit name="btn" value="b">
</FORM>
当使用者按下“a”按钮的时候btn=a,按下“b”按钮,则btn=b。
另外也可以通过提交按钮的名字(name)来判断,请见如下代码:



PHP代码
<FORM method="POST" Action=test.php>
<input type=submit name="a" value="提交A">
<input type=submit name="b" value="提交B">
</FORM>
这样只要POST/GET的参数里面有a或b,就可以知道按下的按钮是哪个。

<?php
print_r($_POST);
?>
分享到:
评论

相关推荐

    php后退一页表单内容保存实现方法

    php表单在提交之后再后退,表单的内容默认是被清空的(使用session_start的时候), 解决方法是在session_start() 之后,字符输出之前写上 复制代码 代码如下: header(“Cache-control: private”); 网页的缓存是由HTTP...

    基于SpringBoot、mybatis、Shiro的权限管理系统

    用户管理:用户是系统操作者,该功能主要完成...缓存监控:对系统的缓存查询,删除、清空等操作。 在线构建器:拖动表单元素生成相应的HTML代码。 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统

    SpringBoot 权限管理系统 适合毕业设计

    用户管理:用户是系统操作者,该功能主要完成...缓存监控:对系统的缓存查询,删除、清空等操作。 在线构建器:拖动表单元素生成相应的HTML代码。 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统

    ajax清理缓存

    ajax清理缓存,对于一个浏览器,第一次点击是会调用rpc请求的, 但是你再用同一个浏览器提交表单的时候, rpc不会被提交, 因为参数一样, 这个可能是ajax的XMLHttpRequest对象的问题, 如设置了时间间隔了,实际上...

    MF00414-SpringBoot快速开发平台源码.zip

    SpringBoot快速开发平台源码 ...缓存监控:对系统的缓存查询,删除、清空等操作。 在线构建器:拖动表单元素生成相应的HTML代码。 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。

    PowerShell中编程清空IE缓存方法

    使用RunDll32.exe 来运行Internet选项的对应功能:  Temporary Internet Files (Internet临时文件)  RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8 ... Form Data (表单数据)  RunDll32.exe InetCp

    当用户退出点击浏览器后退仍可回到原来页面的解决方案

    解决方案1:禁用缓存,前一次使用的方法,在电脑上各浏览器都没问题,但在ipad、安卓手机上仍有问题 解决方案2:禁用浏览器后退键 [removed] window.history.forward(1); 结果和方案一一样的结果,pad上没效果 ...

    仿世纪佳缘婚介交友系统5.3 ASP+SQL

    、用户在线超时时间即为统计记录用户在线,在超过一定时间系统会自动清空这些超时用户、或者已经长期不活动的用户!默认为40分钟即可。 、金币操作记录天数,即会员在充值、消费操作时数据库记录的时间段,...

    Clean Guru - cache & history cle-1.0.10.zip

    -清空缓存 -删除Cookie以及其他网站和插件数据 我们轻巧的扩展程序使您只需单击一下Chrome浏览器工具栏中的&ldquo;擦除&rdquo;图标即可立即执行上述所有操作。 擦除Chrome历史记录和缓存数据从未如此简单。只需...

    Click&Clean 清除浏览记录-9.7.8.1.zip

    -清空缓存 -删除Cookie -清除已保存的密码,清除已保存的表单数据 -DeleteWebLocalStorages -DeleteExtensionLocalStorages -DeleteWebSQLDatabases -DeleteExtensionSQLDatabases -GoogleGears认证数据删除 -删除...

    Android代码-XHttp2 一个功能强悍的网络请求库

    XHttp2 一个功能强悍的网络请求库,使用RxJava2 Retrofit2 OKHttp组合进行封装。 关于我 特征 支持默认、全局、局部三个层次的配置功能。...支持根据key删除网络缓存和清空网络缓存。 提供默认的标准Api

    IE WebBrowser编程技巧

    清空IE缓存 单独删除某一URL的缓存 清空历记录 读取IE历史记录 防止脚本关闭WebBrowser 连接是否有效 InternetCheckConnection res协议可以使浏览器显示储存在资源中HTML 往IE中嵌入工具条 阻断弹出式广告的BHO 自动...

    文章管理系统

    5.对首页最新评论和最新留言中连续数字或者连续字母进行强制换行,防止内容被隐藏 6.解除对p、img、input、button等标签默认空隙的限制 7.屏蔽掉网站数据库和采集数据库的数据库还原功能 8.广告管理中广告编辑,加入...

    Browser privacy clean-up assistant-crx插件

    语言:English (United States) 帮助您清理您的Google Chrome浏览历史记录和各种私有...清空缓存 4.删除cookie和其他站点和插件数据 5.清除保存密码 6.清除保存自动填充表单数据 7.清除数据托管应用程序 8.取消内容许可

    v6php168整站系统 6.02 简体GBK

    此版本已完善与修正的功能大致有如下: 1.清空短消息增加:是/否,选项 2.下载与看视频扣积分改为1小时内不重复扣积分 ...26.修正用户恶意更改URL导致缓存文件替换程序文件的问题 27.专题内容页增加分页功能

    360系统垃圾清理3.0独立版免安装.zip

    最近打开的文件 文件扩展名历史记录最近打开的程序历史记录 通知区域图标历史记录Windows系统日志 清空回收站 内存转储文件Windows搜索历史 网络驱动器映射历史 剪贴板内容四、应用程序历史记录 Windows画图...

    浏览器隐私清理助手「Browser privacy clean-up assistant」-crx插件

    帮助您清理您的Google Chrome浏览记录和...清空缓存4.删除Cookie和其他网站以及插件数据5.清除保存的密码6.清除保存的自动填写的表单数据7.清除数据托管的应用程序8。取消内容许可 支持语言:English (United States)

    alfred powerpack3.3

    切换到使用阿尔弗雷德的文件缓存中的“打开方式”的行动,允许更快的结果,并尊重模糊设置 修复 使用Alfred的快捷键时,隐藏阿尔弗雷德和快速查找正显示出修正崩溃阿尔弗雷德 删除从iTunes迷你播放器无关的项目,如...

    Close & Clean-crx插件

    您可以将扩展名设置为:* 清空缓存*清除应用缓存*删除cookie.*删除下载历史记录*清除文件系统*删除保存(自动填充)表单数据* 清除浏览记录*删除索引数据*删除本地存储数据*清除插件数据*删除已保存的密码*清除Web...

Global site tag (gtag.js) - Google Analytics