机器学习和生物信息学实验室联盟
标题:
Jsp中怎么防止刷新重复提交数据?
[打印本页]
作者:
hsc
时间:
2011-12-5 17:37
标题:
Jsp中怎么防止刷新重复提交数据?
本帖最后由 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里的令牌功能,回头把经验分享给大家,如果大家有什么更好的建议,欢迎大家分享!!!
欢迎光临 机器学习和生物信息学实验室联盟 (http://123.57.240.48/)
Powered by Discuz! X3.2