博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.Net基础 - 6.Cookie + 7.Session原理
阅读量:4317 次
发布时间:2019-06-06

本文共 4418 字,大约阅读时间需要 14 分钟。

   

6.Cookie

表单是和页面相关的,只有浏览器端提交了这些数据服务器端才能得到。而有时候希望在服务端任意的地方存取一些和访问者相关的信息,这时候就不方便将这些信息保存到表单中了,因为如果那样的话必须随时注意在所有页面表单中都保存这些信息。Cookie是和站点相关的,并且每次向服务器请求的时候除了发送表单参数外,还会将和站点相关的所有Cookie都提交给服务器,是强制性的。Cookie也是保存在浏览器端的,而且浏览器会在每次请求的时候都会把和这个站点的相关的Cookie提交到服务器,并且将服务端返回的Cookie更新回数据库,因此可以将信息保存在Cookie中,然后在服务器端读取、修改。服务器返回数据除了普通的html数据以外,还会返回修改的Cookie,浏览器把拿到的Cookie值更新本地浏览器的Cookie就可以

案例:

cookie1.aspx

cookie1.aspx.cs
protected void Button1_Click(object sender, EventArgs e)    {        Response.SetCookie(new HttpCookie("color",TextBox1.Text));//在客户端也能通过$.cookie取。服务端设置cookie    }

下面是第二个页面

cookie读2.aspx

cookie读2.aspx.cs
protected void Button1_Click(object sender, EventArgs e)    {        Label1.Text = Request.Cookies["color"].Value;    }

 

 

7.Session原理

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

变量1.aspx

变量1.aspx.cs
public partial class 变量1 : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        //给cookie为MySessionId赋值,guid        if (Request.Cookies["MySessionId"] == null)        {            string sessionId = Guid.NewGuid().ToString();            Response.Cookies["MySessionId"].Value = sessionId;        }            }    //设置session    protected void Button2_Click(object sender, EventArgs e)    {        string sessionId = Request.Cookies["MySessionId"].Value;        IDictionary
session = SessionMgr.GetSession(sessionId); session["服务端的数据"] = 3333; } //读取session protected void Button1_Click(object sender, EventArgs e) { string sessionId = Request.Cookies["MySessionId"].Value; IDictionary
session = SessionMgr.GetSession(sessionId); Label1.Text = session["服务端的数据"].ToString(); }}
SessionMgr.cs
public class SessionMgr{    public SessionMgr()    {        //        // TODO: 在此处添加构造函数逻辑        //    }    private static IDictionary
> data = new Dictionary
>(); public static IDictionary
GetSession(string sessionId) { if (data.ContainsKey(sessionId)) { return data[sessionId]; } else { IDictionary
session = new Dictionary
(); data[sessionId] = session; return session; } }}

ASP.Net已经内置了Session机制,把上面的例子用ASP.NetSession重写。不要放太多的对象到Session,Session会有超时销毁的机制,发帖(服务器不可能知道浏览器是否在开着,什么时候关闭),发帖计时,在线时间统计,靠请求来判断是否活着。Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session、Cookie)。不能放太大的数据,放的数据是object

 

7.1案例:用Session实现验证码。

HttpHandler要能够操作Session,要实现IRequiresSessionState接口。为什么每次点击值都变化?很正常,因此每次页面点击页面都会刷新,就向ashx重新请求图片,ashx的ProcessRequest都会执行。正常网站登录成功就进入主页面,没机会让你看到变化,但是一旦输入错误也是变化。

1.创建YZM.ashx

<%@ WebHandler Language="C#" Class="YZM" %>using System;using System.Drawing;using System.Web;using System.Web.SessionState;//HttpHandler使用Session要调用IRequiresSessionState接口public class YZM : IHttpHandler, IRequiresSessionState{    public void ProcessRequest(HttpContext context)    {        context.Response.ContentType = "image/JPEG";        using (Bitmap bitmap = new Bitmap(50, 30))        {            using (Graphics g = Graphics.FromImage(bitmap))            {                //随机的验证码                Random ran = new Random();                int code = ran.Next(1,9999);                string strCode = code.ToString();                //写到Session里                HttpContext.Current.Session["Code"] = strCode;                g.DrawString(strCode,new Font("微软雅黑",12),Brushes.Wheat,new PointF(0,0));                bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);            }        }    }    public bool IsReusable    {        get        {            return false;        }    }}

2.创建页面

    
<
img
src
="YZM.ashx"
/>

3.在验证码验证.aspx.cs代码里写

protected void Button1_Click(object sender, EventArgs e)    {        string yzm = Convert.ToString((Session["Code"]));        if (yzm == TextBox1.Text)        {            Response.Write("正确");        }        else        {            Response.Write("错误");        }    }

 

点击图片产生新的验证码。 <img src="YZM.ashx" onclick="this.src='YZM.ashx?aaa='+new Date()" />每次点击都

生成一个新的地址,让浏览器去请求。在AJAX中还会用。

转载于:https://www.cnblogs.com/tangge/archive/2013/04/16/3023724.html

你可能感兴趣的文章
控件中添加的成员变量value和control的区别
查看>>
Spring Boot Docker 实战
查看>>
Div Vertical Menu ver3
查看>>
Git简明操作
查看>>
InnoDB为什么要使用auto_Increment
查看>>
HDU 1087 Super Jumping! Jumping! Jumping!
查看>>
0007_初始模块和字节码
查看>>
[效率提升]如何管理好你的电脑文件
查看>>
C++实验二
查看>>
使用case语句给字体改变颜色
查看>>
JAVA基础-多线程
查看>>
面试题5:字符串替换空格
查看>>
JSP九大内置对象及四个作用域
查看>>
ConnectionString 属性尚未初始化
查看>>
MySQL基本命令和常用数据库对象
查看>>
poj 1222 EXTENDED LIGHTS OUT(位运算+枚举)
查看>>
进程和线程概念及原理
查看>>
Lucene、ES好文章
查看>>
android 生命周期
查看>>
jquery--this
查看>>