此前我介绍了使用数据库实现的提交验证方案,一些朋友怀疑其效率不佳,认为Session是更好的方案。

的确使用Session也不会消耗太多内存,而且如今内存白菜价,最不济就随手买个2G的插上也就够了,所以我将在此写下Session版的实现提要,其余细节参考前篇。

实现方案简述:

Session中存储一个哈希表用以记录该用户的每一条验证信息,哈希表的键为验证信息的过期时间,值为验证码的明文。

过期时间使用ViewState存储,以发给客户端,并在提交时获取,以读取对应的验证码明文。

传给验证码生成页面的ID参数是经ToFileTime()方法转换的过期时间,验证码生成页获取到此参数后进行逆转换,再读取对应的验证码明文以生成显示。

代码讲解:

先建立一个静态类,名为“提交验证”,将用于存储验证信息的Session变量封装为一个属性:

/// <summary>

/// 验证信息表

/// </summary>

static Hashtable 验证信息

{

get

{

return HttpContext.Session["验证信息"] as Hashtable;

}

set

{

HttpContext.Session["验证信息"] = value;

}

}

清理方法,用于将过期的数据清除:

/// <summary>

/// 清理所有过期的验证信息

/// </summary>

public static void 清理()

{

if (验证信息 == null || 验证信息.Count < 5) return;

foreach (DictionaryEntry f in (Hashtable)验证信息.Clone())

{

if ((DateTime)f.Key < DateTime.Now) 验证信息.Remove(f);

}

}

小于5条验证信息则忽略。

克隆一个验证信息表供foreach使用,如果使用原表循环的话,直接移除内容会改变表长度,从而引发异常。

添加方法:

/// <summary>

/// 添加一个新的验证信息。

/// </summary>

/// <param name="验证码">要保存的验证码</param>

/// <param name="过期时间差值">用于计算过期时间,单位为分钟</param>

/// <returns>过期时间戳</returns>

public static DateTime 添加(string 验证码, byte 过期时间差值)

{

清理();

var 过期时间 = DateTime.Now.AddMinutes(过期时间差值);

if (验证信息 == null) 验证信息 = new Hashtable();

验证信息.Add(过期时间, 验证码);

return 过期时间;

}

在添加前进行过期信息清理工作。

获取、验证、移除方法:

/// <summary>

/// 根据过期时间戳获取对应的验证码

/// </summary>

/// <param name="过期时间戳">验证信息过期时间戳</param>

/// <returns>验证码明文</returns>

public static string 获取(DateTime 过期时间戳)

{

return 验证信息[过期时间戳] as string;

}

/// <summary>

/// 验证用户输入的验证码是否正确

/// </summary>

/// <param name="过期时间戳">验证信息过期时间戳</param>

/// <param name="验证码">用户输入的验证码</param>

/// <returns>返回错误信息,如验证成功则返回null</returns>

public static string 验证(DateTime 过期时间戳, string 验证码)

{

if (过期时间戳 < DateTime.Now) return "验证信息已过期";

var 验证码明文 = 获取(过期时间戳);

if (验证码明文 == null) return "验证信息无效或已过期";

else if (验证码明文.ToLower() != 验证码.ToLower()) return "验证码错误";

else return null;

}

/// <summary>

/// 根据过期时间戳移除对应的验证信息

/// </summary>

/// <param name="过期时间戳">验证信息过期时间戳</param>

public static void 移除(DateTime 过期时间戳)

{

验证信息.Remove(过期时间戳);

}

使用方法:

使用时在页面上封装一个基于ViewState属性:

/// <summary>

/// 时间戳属性,基于ViewState

/// </summary>

public DateTime? 时间戳

{

get

{

return ViewState["时间戳"] as DateTime?;

}

set

{

ViewState["时间戳"] = value;

}

}

然后在load事件中调用:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

时间戳 = 提交验证.添加();

Image1.ImageUrl = "~/VerifyImage.aspx?ID=" + 时间戳.Value.ToFileTime();

}

}

(无参数的“添加”方法是我实现的一个适配器封装方法,采用默认的过期时间设置,随机生成验证码)

提交时的调用:

protected void Button1_Click(object sender, EventArgs e)

{

var s = 提交验证.验证(时间戳.Value, TextBox1.Text);

if (s == null)

{

CustomValidator1.IsValid = true;

//提交...

提交验证.移除(时间戳.Value);

}

else

{

CustomValidator1.IsValid = false;

CustomValidator1.ErrorMessage = s;

}

}

提示:

验证码生成时,建议只采用这些字符:2345678abcdefghijkmnprstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ

这里放弃了一些容易产生视觉混淆的字符,比如1和I、l,0和O、o,减少用户挠墙、砸电脑的可能。

下载本文的PDF版本:http://www.box.net/shared/m3jzm2x837

本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2008/10/21/1316086.html,如需转载请自行联系原作者

较为周全的Asp.net提交验证方案(Session版)相关推荐

  1. [导入]较为周全的Asp.net提交验证方案 (下)

    摘要: 下面要对这个生成的"提交验证"类进行功能扩展,通过.Net的"部分类"或"扩展方法"技术都可以轻松实现,这里采用的是"部分 ...

  2. 较为周全的Asp.net提交验证方案 (下)

    接上篇. 下面要对这个生成的"提交验证"类进行功能扩展,通过.Net的"部分类"或"扩展方法"技术都可以轻松实现,这里采用的是"部 ...

  3. Asp.net MVC验证那些事(4)-- 自定义验证特性

    在项目的实际使用中,MVC默认提供的Validation Attribute往往不够用,难以应付现实中复杂多变的验证需求.比如, 在注册用户的过程中,往往需要用户勾选"免责声明", ...

  4. LightSwitch 2011 数据字段唯一性验证方案

    LightSwitch 2011 数据字段唯一性验证方案 验证单表数据的某个字段不能输入重复值 设置实体字段唯一索引 如果不写代码,那么验证只会在用户提交[保存]数据后,会提示错误,很明显这样的用户体 ...

  5. jQuery框架学习第八天:ASP.NET jQuery实施方案

    jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...

  6. ajax提交,form表单提交,onsubmit=return checksubmit()提交验证

    Ajax提交的两种方式: 一是url参数提交数据, 二是form提交(和平常一样在后台可以获取到Form表单的值).在所要提交的表单中,如果元素很多的话建议用第二种方式进行提交 一.Url参数提交数据 ...

  7. php直播源码,生成验证码并提交验证

    php直播源码,生成验证码并提交验证的相关代码 一般处理程序(WaterMark.ashx)中代码 using System; using System.Collections.Generic; us ...

  8. HTTP 请求未经客户端身份验证方案“Anonymous”授权。从服务器收到的身份验证标头为“Basic realm=xxxxx”

     asp.net调用java的Web service(Web服务),需要用户及密码认证,弹出IE的登录窗口. 出现如下错误:HTTP 请求未经客户端身份验证方案"Anonymous&qu ...

  9. Asp.net 身份验证、授权概述

    [本周]如约而至;时间是争取来的,这回的[本周]是把若干零碎的时间利用起来成文的,完成对Asp.net身份验证.访问授权等内容的梳理,可能漏掉的东西会比较多,漏掉的还是希望大家来补充.顺便说一下上次[ ...

最新文章

  1. 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)
  2. shell脚本中28个特殊字符的作用简明总结
  3. jMeter debug postprocessor的用法
  4. SAP CRM WebClient UI Search against extension field
  5. Gigabit Ethernet复制数据会异常的缓慢
  6. 闪光灯slave是什么意思_闪光灯实战讲解 | 室内光线+闪光灯使用配合=完美光效...
  7. 从零学ELK系列(七):Centos安装Filebeat(超详细图文教程)
  8. 命令行编译_[Bazel]自定义命令行编译标志
  9. 使用gson解决java对象循环引用问题
  10. python lncrna_分析指令备份.sh
  11. 炒菜机器人煎鸡蛋视频_还在用油炒鸡蛋?赶紧试试用“它”炒,鸡蛋滑嫩还不粘锅!大厨轻易不透露...
  12. hbuilder调试代码_【移动端】hbuilder创建app并利用真机运行调试
  13. 元学习 - Learning How to Learn - 第一课:集中与发散思维
  14. 灵州会盟及民族友好历史传统研讨会在吴忠召开
  15. 深大计算机图形学大作业之虚拟场景建模
  16. bpe分词算法的原理以及在机器翻译中的应用
  17. Navicat出现超出试用期无法打开的解决办法,亲测有效!
  18. 量子力学(4) 全同粒子
  19. 服务器虚拟化vmware hyper-v,浅谈Hyper-v与VMware服务器虚拟化比较
  20. C# Find() 与 FindAll()方法的使用

热门文章

  1. 禁用sslv3协议linux,SSLv3协议漏洞修复方法
  2. unity 当前移动方向_Unity小工具:溶解效果(Dissolve)
  3. opencv实现xld_halcon学习网
  4. python tkinter画笑脸_tkinter绘制红绿灯图案
  5. 学习vue3系列computed
  6. 两栏布局的5中实现方式
  7. 15.三数之和-LeetCode
  8. php 设置cors,php – 启用cors在.htaccess
  9. r语言ggplot2一夜多图_跟着Nature microbiology学画图~R语言ggplot2画直方图
  10. html设置nav标签高度,html – Bootstrap带导航栏的100%高度