接上篇。

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

引用生成的ADO.NET Entity Framework数据模型的命名空间,且声明为部分类。

书写静态构造函数及一个静态属性:

static 提交验证()

{

过期时间差值=3;

}

/// <summary>

/// 用于计算过期时间,单位为分钟

/// </summary>

public static double 过期时间差值

{

get

{

return _过期时间差值;

}

set

{

_过期时间差值=value;

}

}

private static double _过期时间差值;

书写添加验证信息的方法:

/// <summary>

/// 添加一个新的验证信息,注意在此前应为Session中的任意变量赋值,否则SessionID将随机变化,无法通过验证

/// </summary>

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

/// <returns>验证信息ID</returns>

public static Guid 添加(string 验证码)

{

var a = new 提交验证

{

ID = Guid.NewGuid(),

会话ID = HttpContext.Current.Session.SessionID,

是否已提交 = false,

验证码 = 验证码,

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

};

using (CommonDBEntities c=new CommonDBEntities())

{

c.AddTo提交验证(a);

c.SaveChanges();

}

return a.ID;

}

此方法将返回添加的验证信息的GUID,需注意的是在执行此方法之前,必须曾为Session赋值过,未赋值的话SessionID将是随机的,这会让后面的验证函数认为客户端被劫持。

获取验证信息的方法:

/// <summary>

/// 通过ID获取验证信息

/// </summary>

/// <param name="ID">验证信息ID</param>

/// <returns>验证信息</returns>

public static 提交验证 获取(Guid ID)

{

try

{

提交验证 a;

using (CommonDBEntities c = new CommonDBEntities())

{

a = c.提交验证.First(f => f.ID == ID);

}

return a;

}

catch { return null; }

}

验证用户提交信息的方法:

/// <summary>

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

/// </summary>

/// <param name="ID">验证信息ID</param>

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

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

public static string 验证(Guid ID, string 验证码)

{

var 验证信息 = 提交验证.获取(ID);

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

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

else if (验证信息.是否已提交) return "信息已被提交过";

else if (验证信息.会话ID.Trim() != HttpContext.Current.Session.SessionID) return "验证信息被非法劫持";

else if (验证信息.验证码.Trim().ToLower() != 验证码.ToLower()) return "验证码错误";

else return null;

}

标记已提交信息及清理超时信息的方法:

/// <summary>

/// 将指定ID的验证信息设为已提交

/// </summary>

/// <param name="ID">验证信息ID</param>

public static void 设为已提交(Guid ID)

{

using (CommonDBEntities c = new CommonDBEntities())

{

var a = c.提交验证.First(f => f.ID == ID);

a.是否已提交 = true;

c.SaveChanges();

}

清理(false);

}

/// <summary>

/// 清理数据库中已失效的旧数据

/// </summary>

/// <param name="是否清理已提交的数据">是否连带清理已提交过的数据,否则只清理过期数据</param>

/// <returns>波及的数据总量</returns>

public static int 清理(bool 是否清理已提交的数据)

{

int x = 0;

using (CommonDBEntities c = new CommonDBEntities())

{

var a = c.提交验证.Where(f => f.过期时间 < DateTime.Now || (是否清理已提交的数据 ? f.是否已提交 : false));

foreach (提交验证 f in a)

{

c.DeleteObject(f);

}

x=c.SaveChanges();

}

return x;

}

在设置已提交的方法中顺手清理超时信息。

至此,验证类就编写完成了。

接下来看看如何使用,先创建一个这样的页面:

如前所述,验证信息ID会明文发给客户端,即保存在HiddenField控件中。

CustomValidator用于显示错误提示。

以下为页面Load事件的代码:

注意在调用添加验证信息的函数之前设置过了Session的变量,确保SessionID不会再发生改变。

关于生成验证图片的代码到处都是,这里就不累述了,只要通过Url参数“ID”获取到GUID,再以此获取对应的验证码即可开始生成工作。

以下是页面提交的代码:

应用效果:

数据库数据:

本文至此结束,希望能给各位以帮助,如有更好的解决方案,欢迎在此探讨。

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

转载于:https://www.cnblogs.com/SkyD/archive/2008/10/14/1310473.html

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

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

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

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

    此前我介绍了使用数据库实现的提交验证方案,一些朋友怀疑其效率不佳,认为Session是更好的方案. 的确使用Session也不会消耗太多内存,而且如今内存白菜价,最不济就随手买个2G的插上也就够了,所 ...

  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. 不敢相信,居然用Java写了个“天天酷跑”!
  2. Android之了解ThreadLocal
  3. 5款常见原型工具,产品特色知多少?
  4. 需求工程-软件需求模式读书笔记3
  5. BAT 才不关心币价,19年的5大重点在这里!
  6. 后端开发实践:Spring Boot项目模板
  7. 已知一个特殊字符的 unicode 编码值,如何在 ABAP 里打印出这个特殊字符?
  8. 平衡二叉树,AVL树之图解篇
  9. Go-json解码到接口及根据键获取值
  10. 路畅畅云固件升级教程_斐讯K2P MTK版简单几步刷入breed教程,附刷第三方固件方法...
  11. python自动给头像添加圣诞帽
  12. 2.抽象工厂(Abstract Factory)
  13. 获取高程数据以及转灰度图和裁剪操作
  14. 如何快速去掉word页眉横线
  15. firefox主页被360篡改_IE浏览器主页被劫持,如何解决主页被篡改问题?
  16. 数据挖掘基础学习笔记
  17. 数字电路设计: FPGA实现倍频
  18. 用vb程序设计输出100以内素数和
  19. Android布局优化之TextView、ImageView合二为一
  20. urp综合教务系统 php 课表,URP综合教务系统教师录入成绩指南

热门文章

  1. UVALive4256 Salesmen
  2. DOM事件与jQuery事件的是非纠葛
  3. C语言中extern修饰符的用法
  4. android wifi连接手机,Android手机无线连接利器-AirDroid
  5. HashMap jdk1.7和1.8概述
  6. Vue介绍-Vue简单应用-Vue基本用法
  7. AAPT2 error: check logs for details.
  8. 云智慧压测实战分享之JMeter脚本录制实例
  9. centos7编译 openjdk8
  10. UDP协议下的DatagramSocket和DatagramPacket