自从上次有了一次破解验证码的经验后,就一直想自己写个像样点的验证码。今天无聊所以就写了,总体上来说还算很满意。就是有时复杂得肉眼都看不出是啥(这也跟图片太小有关系)。
这个验证码支持随机字体、字体大小、字体样式(普通、粗体、斜体)、字体颜色、自定义字符等。
代码中的libFont是字体库,libChar是字符库,libColor是颜色库,可以自己扩充。
两个while循环,第一个是画干扰线的,第二个是画字符的,线和字符的多和少可以自己控制。
最后是Session["SAFECODE"],自己也可以修改,默认是把所有字符都转成大写的。
其它的就没什么好说的了,看代码吧。
<%@ Page Language="C#" %>
<%@ import Namespace="System.IO" %>
<%@ import Namespace="System.Web" %>
<%@ import Namespace="System.Drawing" %>
<mce:script runat="server"><!--
// 样式库 格式: Name|Size(em)|Style
private static string[] libFont = new string[]
{
"宋体|12|Bold", "宋体|12|Italic", "宋体|12|Regular",
"Arial|12|Bold", "Arial|12|Italic", "Arial|12|Regular",
"Tahoma|12|Bold", "Tahoma|12|Italic", "Tahoma|12|Regular",
"Verdana|12|Bold", "Verdana|12|Italic", "Verdana|12|Regular"
};
// 字符库
private static string[] libChar = new string[]
{
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
"n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"
};
// 颜色库
private static string[] libColor = new string[]
{
"Blue", "Red", "Green", "DarkGreen", "DarkBlue", "Tomato"
};
private void Page_Load(object sender, System.EventArgs e)
{
GetSafeCode();
}
private void GetSafeCode()
{
Random r = null;
Bitmap bmp = null;
Graphics g = null;
MemoryStream stream = null;
string[]
在页面基类中增加以下方法,能够获得比override void OnError(EventArgs e)更高的错误处理优先级和控制权,override void OnError(EventArgs e)方式中OnError被执行完毕后基类(Page)的OnError在后续被调用,当前页面随即丧失控制权.
protected void Page_Error(object sender, EventArgs e)
{
&nb ......