维纳斯
在程序中寻找自由与成就感~~~~

1.下面讲一下全局变量和局部变量的区别

新建一个web页面,拖一个label控件,id为Label1;一个Button控件,id为Button1:

 1     private int i = 0;//每次请求来了都会new一个新的实现了IhttpHandlder接口的类“变量1”的实例进行处理,用完了就GC掉,所以不会保持上次的值。
 2 
 3     private static int j = 0;//所有的访问者都王文同一个实例
 4     protected void Page_Load(object sender, EventArgs e)
 5     {
 6 
 7     }
 8     protected void Button1_Click(object sender, EventArgs e)
 9     {
10         //i++;
11         //Label1.Text = i.ToString();
12 
13         j++;
14         Label1.Text = j.ToString();
15     }


2.Cookie不能存储过多信息, 如果想保存大量的数据,可以保存一个Guid到Cookie中,然后在服务器中建立一个以Guid为key,复杂数据位Value的全局Dictionary。Static字段对于不同用户也只有一份,因此用static实现多用户共享数据。

下面讲一个session的原理:

在App_Code中新建一个类,MySession.cs,代码如下:

public class MySession
{
    private static IDictionary<string, IDictionary<string, object>> data = new Dictionary<string, IDictionary<string, object>>();
   public static IDictionary<string,object>  GetSession(string sessionId)
   {
       if(data.ContainsKey(sessionId))
       {
           return data[sessionId];
       }
       else
       {
           IDictionary<string, object> session = new Dictionary<string, object>();
           data[sessionId]=session;
           return session;
       }
   }

新建一个Web页面,拖两个Button控件,一个Label控件,设置Session值和读取Session的代码如下:

 1  protected void Page_Load(object sender, EventArgs e)
 2     {
 3         
 4         if (Request.Cookies["mySessionId"] == null)
 5         {
 6             string sessionId = Guid.NewGuid().ToString();
 7             Response.SetCookie(new HttpCookie("mySessionId", sessionId));
 8         }
 9 
10     }
11     protected void Button1_Click(object sender, EventArgs e)//设置Session里面的值
12     {
13         string sessionId=Request.Cookies["mysessionId"].Value;
14          IDictionary<string,object> session= MySession.GetSession(sessionId);
15         session["服务器端数据1"] = "叶子";
16         session["服务器端数据2"] = "佳佳";
17     }
18     protected void Button2_Click(object sender, EventArgs e)//读取Session里面的值
19     {
20         string sessionId = Request.Cookies["mySessionId"].Value;
21         IDictionary<string, object> session = MySession.GetSession(sessionId);
22         Label1.Text = Convert.ToString(session["服务器端数据1"]) + Convert.ToString(session["服务器端数据2"]); ;
23     }

3.实际上Asp.net已经内置了Session机制,把上面的例子用asp.netSession重写:
新建一个web页面,拖两个Button控件和一个Label控件,添加两个按钮的双击事件,写如下代码:

 1    protected void Page_Load(object sender, EventArgs e)
 2     {
 3 
 4     }
 5     protected void Button1_Click(object sender, EventArgs e)
 6     {
 7         Session["name"] = "叶子";
 8         Session["data"] = DateTime.Now.ToString();
 9     }
10     protected void Button2_Click(object sender, EventArgs e)
11     {
12         Label1.Text = Convert.ToString(Session["name"]) + Convert.ToString(Session["data"]);
13     }

可以看到Session机制并不是Http协议规定的,是asp.net实现的,现在,php,jsp等大部分服务端技术都实现了session,原理都差不多。

4. 不要放太多的对象到Session,Session会有超时销毁的机制。发帖(服务器不可能知道浏览器是否在开着,什么时候关闭)。Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据。不能放太大的数据,放的数据是object.不希望用户改的数据要放到session里边。

5.session版自增

新建一个web页面,拖放一个Button控件,添加该控件的双击事件,代码如下:

 1    protected void Page_Load(object sender, EventArgs e)
 2     {
 3         //每次服务器处理page_load都会执行,直接进入的时候才给Session里的value设置初始值
 4 
 5         if (!IsPostBack)
 6         {//如果网站是第一次加载
 7             Session["value"] = "0";
 8         }
 9     }
10     protected void Button1_Click(object sender, EventArgs e)
11     {
12         int v = Convert.ToInt32(Session["value"]);
13         v++;
14         Session["value"] = v;
15         TextBox1.Text = Convert.ToString(Session["value"]);
16     }

6.案例:用session实现验证码机制

新建一个一般处理程序页面,添加如下代码:

 1 context.Response.ContentType = "image/JPEG";
 2          using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(100, 50))
 3           {
 4               using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
 5               {
 6                   //g.DrawString("叶子佳佳", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Green, new System.Drawing.PointF(0, 0));
 7                   //g.DrawEllipse(System.Drawing.Pens.Red,new System.Drawing.Rectangle(10,10,10,10));
 8                   //System.Drawing.Pen pen = (System.Drawing.Pen)System.Drawing.Pens.Red.Clone();
 9                   //pen.Width = 3;
10                   //g.DrawEllipse(pen,new System.Drawing.Rectangle(20,20,10,20));
11                   Random rand = new Random();
12                   int code = rand.Next(1000,9999);//产生一个随机数
13                   string strCode = code.ToString();
14                   HttpContext.Current.Session["Code"] = strCode;//将这个随机数记录到session中
15                   g.DrawString(strCode,new System.Drawing.Font ("宋体",30),System.Drawing.Brushes.Green,new System.Drawing.PointF(0,0));//画出这个随机数
16                   bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);//将画有随机数的图片在屏幕上显示出来。
17               } 
18           }

新建一个web页面,拖放一个Button控件和一个TextBox控件,在web页面的源页面添加以下代码:

1 <div>
2        <img src="YZMr.ashx" onclick="this.src='YZMr.ashx?aaa='+new Date()+''" />
3 
4             .......
5 </div>

双击Button,添加以下代码:

 1         protected void Button1_Click(object sender, EventArgs e)
 2     {
 3         string CorretNum = Convert.ToString(Session["Code"]);
 4         if (TextBox1.Text == CorretNum)
 5         {
 6             Response.Write("输入正确");
 7         }
 8         else
 9         {
10             Response.Write("输入错误");
11         }
12 
13     }

以上就是Session的知识。


 


 

 

posted on 2012-11-13 07:54  维纳斯  阅读(207)  评论(0编辑  收藏  举报