机器学习和生物信息学实验室联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5795|回复: 0
打印 上一主题 下一主题

Jsp中怎么防止刷新重复提交数据?

[复制链接]
跳转到指定楼层
楼主
发表于 2011-12-5 17:37:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hsc 于 2011-12-5 17:38 编辑

在一些web server中,是不是总是会遇到这些问题,当你的问题处理完之后,有些用户会总是喜欢的刷新一两次,但是也许你的

处理代码正好又是你的输出代码,于是问题产生了,用户的每一次刷新都会重新运行一下这些处理代码,相当于重新提交了一

次,如果简单的webserver还可以,重复提交也无所谓,最多消耗一下服务器内存资源而已。但是如果你的server有一些临时数

据的话,并且这些临时数据还必须为用户保留的时候,就会是一个不得不考虑的问题了,每一个用户刷新个十几次(是不是大

家都有这个习惯,没事的话,总喜欢按着F5一直不放),那么相当于程序被执行了N多次,那么N多次所产生的临时数据就全部

堆放到服务器上了,如果用户量小的话,也无所谓,但是一旦网站做大了得话,每天服务器要承受N大的垃圾数据,所以禁止刷

新重新提交是很必须的。

禁止刷新重复提交的数据有很多种方法,其中之一就是定义全局的session,在起始页面定义一个,然后到处理代码里更改一

下,在下一次运行到处理代码的时候,就检查一下这个参数,比如说举个例子,我可以定义一个变量isFirst,初始值赋为true,

然后在处理代码中更改值为false,当然要在处理代码的顶端首先检查一下这个变量,如果是false,则说明不是第一次提交过来

的,是刷新后的操作,于是给用户提示或者摒弃都可以,如果为true则说明是第一次,就处理。

例子可参考:http://datamining.xmu.edu.cn:8080/graph/

你可以提交一次,然后在显示页面刷新一次,然后会提示你,只有一次机会,并且会显示之前的老页面。

这个例子里我只是禁止了刷新重复提交,但是用户后退的时候完全就被当为另一个用户了,如果在其他的server里后退的话还不

能被允许当做别的怎么办呢,在上边的这个例子里很简单可以实现,只需要把isFirst的初始化给删除掉就可以了,然后在处理代

码的顶端加上如果获取isFirst的值为NULL,也说明是第一次啊,但是用户运行之后,就算是后退,那么这个isFirst的值依然是

false,这样就防止了用户后退然后在重新提交。上边的这个例子是可以后退重复提交的,因为程序不大,所以为了测试方便,这

个功能我就没有禁止。

还有如果是其他的web server,需要很多的地方,那么我们还可以设置随机数,然后页面中保存一个值,这个值可以用hidden的

input保存,然后定义一个session,如果需要禁止的时候,就把两个进行比对,如果相符就不是刷新,然后消除掉session,如果

不相符,那么就是重复提交,可以给出提示或者摒弃等等。

当然这只是一个比较小的例子,所以相对来说简单了些,其实对于防止刷新重复提交的还有很多其他的技术,我现在在研究

struts里的令牌功能,回头把经验分享给大家,如果大家有什么更好的建议,欢迎大家分享!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

机器学习和生物信息学实验室联盟  

GMT+8, 2024-11-23 08:55 , Processed in 0.077708 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表