原文地址:
http://www.oksvn.com/Article/Detail-71.shtml
摘录:
大型站点都是把验证码服务器和应用服务器分开的。具体的做法有两种:
1.获取验证码的时候验证码服务器往客户端写验证cookies,提交的时候服务端获取这个cookie和提交上来的验证码,再去验证码服务器验证。
2.获取验证码的时候传个应用这边的session到验证码服务器那边,提交的时候服务端把应用这边的session和提交上来的验证码一起到验证码服务器验证。
实现例子:
首先要解决的一个问题就是怎么样把客户端请求的验证码数据存储起来而且要两边都能够访问我是这样解决的:
using System;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace Flyimg.Verify.Server
{
public class CodeSession
{
/// <summary>
/// 存放验证数据链表
/// </summary>
private static LinkedList<CodeSession> VerifyCodeList = new LinkedList<CodeSession>();
private string _SessionId;
private string _VerifyCode;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="strSessionId"></param>
/// <param name="strVerifyCode"></param>
public CodeSession(string strSessionId, string strVerifyCode)
{
_SessionId = strSessionId;
_VerifyCode = strVerifyCode;
}
/// <summary>
/// 添加验证码数据
/// </summary>
/// <param name="strSessionId"></param>
/// <param name="strVerifyCode"></param>
/// <returns></returns>
public static string Add(string strSessionId, string strVerifyCode)
{
bool bResult = false;
LinkedListNode<CodeSession> CurrentPlay = new LinkedListNode<CodeSession>(new CodeSession(strSessionId, strVerifyCode));
try
{
//保持链表长度限制客户端连接数
if (VerifyCodeList.Count < int.Parse(ConfigurationManager.AppSettings["Capacity"].ToString()))
{
VerifyCodeList.AddFirst(CurrentPlay);
}
else
{
VerifyCodeList.RemoveLast();
VerifyCodeList.AddFirst(CurrentPlay);
}
bResult = true;
}
catch
{
bResult = false;
}
return bResult.ToString();
}
/// <summary>
/// 删除验证码数据
/// </summary>
/// <param name="strSessionId"></param>
/// <param name="strVerifyCode"></param>
public static void Remove(string strSessionId, string strVerifyCode)
{
CodeSession codesession = new CodeSession(strSessionId, strVerifyCode);
VerifyCodeList.Remove(codesession);
}
/// <summary>
/// 验证验证码数据
/// </summary>
/// <param name="strSessionId"></param>
/// <param name="strVerifyCode"></param>
/// <returns></returns>
public static string Verify(string strSessionId, string strVerifyCode)
{
int iResult = 0;
foreach (CodeSession codesession in VerifyCodeList)
{
if (codesession._SessionId == strSessionId && codesession._VerifyCode == strVerifyCode)
{
iResult = 1;
Remove(strSessionId, strVerifyCode);
break;
}
}
return iResult.ToString();
}
/// <summary>
/// 清除验证数据
/// </summary>
public static void Clear()
{
VerifyCodeList.Clear();
}
}
}
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace Flyimg.Verify.Server
{
public class CodeSession
{
/// <summary>
/// 存放验证数据链表
/// </summary>
private static LinkedList<CodeSession> VerifyCodeList = new LinkedList<CodeSession>();
private string _SessionId;
private string _VerifyCode;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="strSessionId"></param>
/// <param name="strVerifyCode"></param>
public CodeSession(string strSessionId, string strVerifyCode)
{
_SessionId = strSessionId;
_VerifyCode = strVerifyCode;
}
/// <summary>
/// 添加验证码数据
/// </summary>
/// <param name="strSessionId"></param>
/// <param name="strVerifyCode"></param>
/// <returns></returns>
public static string Add(string strSessionId, string strVerifyCode)
{
bool bResult = false;
LinkedListNode<CodeSession> CurrentPlay = new LinkedListNode<CodeSession>(new CodeSession(strSessionId, strVerifyCode));
try
{
//保持链表长度限制客户端连接数
if (VerifyCodeList.Count < int.Parse(ConfigurationManager.AppSettings["Capacity"].ToString()))
{
VerifyCodeList.AddFirst(CurrentPlay);
}
else
{
VerifyCodeList.RemoveLast();
VerifyCodeList.AddFirst(CurrentPlay);
}
bResult = true;
}
catch
{
bResult = false;
}
return bResult.ToString();
}
/// <summary>
/// 删除验证码数据
/// </summary>
/// <param name="strSessionId"></param>
/// <param name="strVerifyCode"></param>
public static void Remove(string strSessionId, string strVerifyCode)
{
CodeSession codesession = new CodeSession(strSessionId, strVerifyCode);
VerifyCodeList.Remove(codesession);
}
/// <summary>
/// 验证验证码数据
/// </summary>
/// <param name="strSessionId"></param>
/// <param name="strVerifyCode"></param>
/// <returns></returns>
public static string Verify(string strSessionId, string strVerifyCode)
{
int iResult = 0;
foreach (CodeSession codesession in VerifyCodeList)
{
if (codesession._SessionId == strSessionId && codesession._VerifyCode == strVerifyCode)
{
iResult = 1;
Remove(strSessionId, strVerifyCode);
break;
}
}
return iResult.ToString();
}
/// <summary>
/// 清除验证数据
/// </summary>
public static void Clear()
{
VerifyCodeList.Clear();
}
}
}