对你一定很简单,验证码 session问题
生成图形页:
public class imgvil : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
string tmp = RndNum(4);
//HttpCookie a = new HttpCookie( "ImageV ",tmp);
//Response.Cookies.Add(a);
Session [ "mysession "]=tmp;
this.ValidateCode(tmp);
// 在此处放置用户代码以初始化页面
}
private void ValidateCode(string VNum)
{
Bitmap Img=null;
Graphics g=null;
MemoryStream ms=null;
int gheight=VNum.Length*12;
Img=new Bitmap(gheight,25);
g=Graphics.FromImage(Img);
//背景颜色
g.Clear(Color.White);
//文字字体
Font f=new Font( "Arial Black ",10);
//文字颜色
SolidBrush s=new SolidBrush(Color.Black);
g.DrawString(VNum,f,s,3,3);
ms=new MemoryStream();
Img.Save(ms,ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType= "image/Jpeg ";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
Img.Dispose();
Response.End();
}
private string RndNum(int VcodeNum)
{
string Vchar= "0,1,2,3,4,5,6,7,8,9,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 ";
string[] VcArray=Vchar.Split(new Char [] { ', '});
string VNum= " ";
int temp=-1;
Random rand=new Random();
for(int i=1;i <VcodeNum+1;i++)
{
if(temp!=-1)
{
rand=new Random(i*temp*unchecked((int)DateTime.Now.Ticks));
}
int t=rand.Next(35);
if(temp!=-1&&temp==t)
{
return RndNum(VcodeNum);
}
temp=t;
VNum+=VcArray[t];
}
return VNum;
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
--------------------------------
调用页面:
private void Page_Load(object sender, System.EventArgs e)
{
ImageButton1.ImageUrl = "imgvil.aspx ";
string mystr= " ";
//mystr=Session [ "mysession "].ToString ();
Session.Abandon ();
ViewState [ "abc "]=mystr;
// 在此处放置用户代码以初始化页面
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void Button1_Click(object sender, System.EventArgs e)
{
if(txtvalidatecode.Text ==ViewState [ "abc "].ToString ())
{
lblshow.Text = " <font color= 'red '> 提示:验证通过 </font> ";
}
else
{
lblshow.Text = "所填写的验证码与所给的不符 ";
}
}
------------------------------------
报错,说什么未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
源错误:
行 37: string mystr= " ";
行 38:
行 39: mystr=Session [ "mysession "].ToString ();
行 40: Session.Abandon ();
行 41: ViewState [ "abc "]=mystr;
39行出错,我是在imgvil中保存了Session [ "mysession "]=tmp;的,请高手指点
[解决办法]
随机码在调用页面,生成,图片文件里面取.
[解决办法]
请求 调用页面
执行调用页面的Page_Load,此时你需要的那个Session还没产生。
页面执行完毕,生成客户端HTML,
客户端根据HTML,请求图片地址
请求 生成图形页
此时产生图片,生成Session,这个时候Session才产生了,之后才能访问那个Session。
客户看见图片,根据图片,填写表单,点击按钮,页面回发。
再次请求 调用页面
再次执行调用页面的Page_Load,此时你需要的那个Session已经存在了。
执行客户端回发事件,就是Button_Click事件,这个时候也能处理Session。
剩下省略……(上面描述中有 大量事件省略……)