首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

对你一定很简单,验证码 session有关问题

2012-01-31 
对你一定很简单,验证码 session问题 生成图形页:publicclassimgvil:System.Web.UI.Page{privatevoidPage_L

对你一定很简单,验证码 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。
剩下省略……(上面描述中有 大量事件省略……)

热点排行