• ----:)欢迎访问源码网(:----
    • 首页
    • 博客
    • 学院
    • 下载
    • 论坛
    • 影视
    • 发布源码
    • RSS
    • ITPig
    • 笑话网
    • 百家姓
    • 繁體中文

源码网 - 中国第一源码门户
选择镜像:网通镜像 - 电信主站
  • 首 页
  • 新闻动态
  • 网站运营
  • 网页制作
  • WEB开发
  • 编程开发
  • 图像媒体
  • 操作系统
  • 数据库
  • 服务器
热门搜索 优化 SEO 故事 cms IIS7 MySQL 个人 AdSense 主题推广 | 文章搜索: 高级搜索
会员登录/控制面版您的位置: 学院首页 >> WEB开发 >> ASP开发 >> 常见问题 >> 详细内容
 

推荐文章

 
 

热点文章

  • IIS访问出错的解决方法一则
  • ASP常见问题及解答
  • Visual InterDev常见问题解答
  • 没有权限或数据库或对象为只读
  • 各种脚本错误详解!
  • ASP 错误代码
  • 总是出现“HTTP 错误 500.100 - ..
  • 如何更改Access默认的中文输入?
  • 在局域网上如何测试IIS的安装成功?
  • ASP错误信息总汇
  • 在ASP中常见的错误80004005信息和解决办法
  • 怎样直接显示"Monday"等星期的ASP语句?
 
 

相关文章

  • 手动生成C#的COM包装类的常见问题和解决办法
  • Frontpage常见问题问答
  • ASP常见问题及解答
  • Top 和  Distinct 的 区别
  • 大部分的ADO的错误码对应的含义
  • 如何实现动态添加Html文档中Form项
  • ASP Error '0115'的一些解决办法
  • ASP的Internet/Intranet编程常见问题
  • 在ASP中常见的错误80004005信息和解决办法
  • 如何回到先前的页面
  • 如何显示随机图象
  • 如何计算每天的平均反复访问人数
 
 

百度搜索

 
 

在ASP应用中如何限制同一表单被多次提交

  • 阅览次数:
  • 文章来源: 网海之贝
  • 原文作者: 佚名
  • 整理日期: 2006-10-03
  • 发表评论
  • 字体大小:
  • 小
  • 中
  • 大

     在Internet上我们每天都会遇到数不清的表单,也看到其中大部分并没有限制用户多次提交同一个表单。缺乏这种限制有时候会产生某些预料不到的结果,如重复订阅邮件服务或重复投票等。
   
   
       本文介绍在ASP应用中防止用户在当前会话期间多次提交同一表单的一个简单方法。它主要由四个子程序组成,在较为简单的应用场合,你只要将这些代码放在包含文件中直接引用即可;对于那些较为复杂的环境,我们在文章的最后给出一些改进建议。
   
   
       一、基本工作过程
   
       下面我们依次讨论这四个子程序。
   
       (一)初始化
   
       这里我们要在Session对象中保存两个变量,其中:
   
       ⑴ 每一个表单对应一个称为FID的唯一标识,为使该值唯一要用到一个计数器。
   
   
       ⑵ 每当一个表单成功提交,必须在一个Dictionary对象中存储它的FID。
   
   
      
    我们用一个专用的过程来初始化上述数据。虽然以后各个子程序都要调用它,但实际上每一个会话期间它只执行一次:
   
   
    Sub InitializeFID()
    If Not IsObject(Session("FIDList")) Then
    Set Session("FIDList")=Server.CreateObject("Scripting.Dictionary")
    Session("FID")=0
    End If
    End Sub
   
   
       (二)生成表单的唯一标识符
   
       下面这个函数GenerateFID()用于生成表单的唯一标志。该函数首先将FID值加1,然后返回它:
   
   
    Function GenerateFID()
    InitializeFID
    Session("FID") = Session("FID") + 1
    GenerateFID = Session("FID")
    End Function
   
   
       (三)登记已提交表单
   
       当表单成功地提交时,在Dictionary对象中登记它的唯一标识:
   
    Sub RegisterFID()
    Dim strFID
    InitializeFID
    strFID = Request("FID")
    Session("FIDlist").Add strFID, now()
    End Sub
   
   
       (四)检查表单是否重复提交
   
       在正式处理用户提交的表单之前,应该在Dictionary对象中检查它的FID是否已经登记。下面的CheckFID()函数用来完成这个工作,如已经登记,它返回FALSE,否则返回TRUE:
   
   
    Function CheckFID()
    Dim strFID
    InitializeFID
    strFID = Request("FID")
    CheckFID = not Session("FIDlist").Exists(strFID)
    End Function
   
   
       二、如何使用
   
      
    有两个地方要用到上述函数,即表单生成时与结果处理时。假设上述四个子程序已经放入包含文件Forms.inc中,下面的代码根据FID值来决定生成表单还是处理表单结果,它所描述的处理过程适合于大多数ASP应用:
   
   
    < %Option Explicit%>
    < !--#include file="forms.inc"-->
    < HTML>
    < HEAD>
    < TITLE>表单提交测试< /TITLE>
    < /HEAD
    < BODY>
    < %
    If Request("FID") = "" Then
    GenerateForm
    Else
    ProcessForm
    End If
    %>
    < /BODY>
    < /HTML>
   
   
       GenerateForm负责生成表单,表单中应该含有一个隐藏的FID,如:
   
    < %
    Sub GenerateForm()
    %>
    < form action="< %=Request.ServerVariables("PATH_INFO")%>"
    method=GET>
    < input type=hidden name=FID value="< %=GenerateFID()%>">
    < input type=text name="param1" value="">
    < input type=submit value="OK">
    < /form>
    < %
    End Sub
    %>
   
   
       ProcessForm负责处理通过表单提交的内容,但在处理之前应该先调用CheckFID()检查当前表单是否已经提交,代码类如:
   
    < %
    Sub ProcessForm()
    If CheckFID() Then
    Response.Write "你输入的内容是" &
    Request.QueryString("param1")
    RegisterFID
    Else
    Response.Write "此表单只能提交一次!"
    End If
    End Sub
    %>
   
   
       三、限制与改进措施
   
      
    上面我们介绍了在当前会话期间限制同一表单被多次提交的一种方法。在实际应用中可能需要从多方面加以改进,例如:
   
   
       ⑴ 在登记表单ID之前检查用户输入数据的合法性,使得数据不合法时用户可以按“后退”按钮返回,在修正后再次提交同一表单。
   
   
       ⑵
    这种对表单提交的限制最多只能在当前会话期间有效。如果要求这种限制能够跨越多个会话,那么就要用到Cookeis或数据库来保存相关数据了。
   
   
       ⑶
    这种方法是不安全的。它仅用于防范误操作,不能防止熟练用户有意地多次提交同一表单。

上一篇:PHP编程技巧:看实例学正则表达式
下一篇:构建支持Master/Slave读写分离的数据库操作类
  • 网友评论:
  • 查看所有评论
  • 我要发表评论
您的网名:
留言主题:
你要发表的内容:

 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 发布软件 | 帮助中心 | 源码论坛

Copyright © 2005-2007 CodePub.Com  程序支持:木翼  滇ICP备05005971号