较为周全的Asp.net提交验证方案 (下)
接上篇。
下面要对这个生成的“提交验证”类进行功能扩展,通过.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提交验证方案 (下)相关推荐
- [导入]较为周全的Asp.net提交验证方案 (下)
摘要: 下面要对这个生成的"提交验证"类进行功能扩展,通过.Net的"部分类"或"扩展方法"技术都可以轻松实现,这里采用的是"部分 ...
- 较为周全的Asp.net提交验证方案(Session版)
此前我介绍了使用数据库实现的提交验证方案,一些朋友怀疑其效率不佳,认为Session是更好的方案. 的确使用Session也不会消耗太多内存,而且如今内存白菜价,最不济就随手买个2G的插上也就够了,所 ...
- Asp.net MVC验证那些事(4)-- 自定义验证特性
在项目的实际使用中,MVC默认提供的Validation Attribute往往不够用,难以应付现实中复杂多变的验证需求.比如, 在注册用户的过程中,往往需要用户勾选"免责声明", ...
- LightSwitch 2011 数据字段唯一性验证方案
LightSwitch 2011 数据字段唯一性验证方案 验证单表数据的某个字段不能输入重复值 设置实体字段唯一索引 如果不写代码,那么验证只会在用户提交[保存]数据后,会提示错误,很明显这样的用户体 ...
- jQuery框架学习第八天:ASP.NET jQuery实施方案
jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...
- ajax提交,form表单提交,onsubmit=return checksubmit()提交验证
Ajax提交的两种方式: 一是url参数提交数据, 二是form提交(和平常一样在后台可以获取到Form表单的值).在所要提交的表单中,如果元素很多的话建议用第二种方式进行提交 一.Url参数提交数据 ...
- php直播源码,生成验证码并提交验证
php直播源码,生成验证码并提交验证的相关代码 一般处理程序(WaterMark.ashx)中代码 using System; using System.Collections.Generic; us ...
- HTTP 请求未经客户端身份验证方案“Anonymous”授权。从服务器收到的身份验证标头为“Basic realm=xxxxx”
asp.net调用java的Web service(Web服务),需要用户及密码认证,弹出IE的登录窗口. 出现如下错误:HTTP 请求未经客户端身份验证方案"Anonymous&qu ...
- Asp.net 身份验证、授权概述
[本周]如约而至;时间是争取来的,这回的[本周]是把若干零碎的时间利用起来成文的,完成对Asp.net身份验证.访问授权等内容的梳理,可能漏掉的东西会比较多,漏掉的还是希望大家来补充.顺便说一下上次[ ...
最新文章
- 不敢相信,居然用Java写了个“天天酷跑”!
- Android之了解ThreadLocal
- 5款常见原型工具,产品特色知多少?
- 需求工程-软件需求模式读书笔记3
- BAT 才不关心币价,19年的5大重点在这里!
- 后端开发实践:Spring Boot项目模板
- 已知一个特殊字符的 unicode 编码值,如何在 ABAP 里打印出这个特殊字符?
- 平衡二叉树,AVL树之图解篇
- Go-json解码到接口及根据键获取值
- 路畅畅云固件升级教程_斐讯K2P MTK版简单几步刷入breed教程,附刷第三方固件方法...
- python自动给头像添加圣诞帽
- 2.抽象工厂(Abstract Factory)
- 获取高程数据以及转灰度图和裁剪操作
- 如何快速去掉word页眉横线
- firefox主页被360篡改_IE浏览器主页被劫持,如何解决主页被篡改问题?
- 数据挖掘基础学习笔记
- 数字电路设计: FPGA实现倍频
- 用vb程序设计输出100以内素数和
- Android布局优化之TextView、ImageView合二为一
- urp综合教务系统 php 课表,URP综合教务系统教师录入成绩指南