Asp.Net基础 6.Cookie + 7.Session原理

6.Cookie
7.Session原理
    7.1案例:用Session实现验证码。

6.Cookie

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

案例:

cookie1.aspx

image

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

下面是第二个页面

cookie读2.aspx

image

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

image

image

7.Session原理

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

变量1.aspx

image

变量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<string, object> session = SessionMgr.GetSession(sessionId);
        session["服务端的数据"] = 3333;
    }
    //读取session
    protected void Button1_Click(object sender, EventArgs e)
    {
        string sessionId = Request.Cookies["MySessionId"].Value;
        IDictionary<string, object> session = SessionMgr.GetSession(sessionId);
        Label1.Text = session["服务端的数据"].ToString();
      }
}
SessionMgr.cs
public class SessionMgr
{
    public SessionMgr()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }

    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;
        }
    }
}

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.创建页面

<body>
    <form id="form1" runat="server">
    <div>
    
<img src="YZM.ashx"/>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
    </div>
    </form>
</body>

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("错误");
        }
    }

imageimage

点击图片产生新的验证码。 <img src="YZM.ashx" onclick="this.src='YZM.ashx?aaa='+new Date()" />每次点击都
生成一个新的地址,让浏览器去请求。在AJAX中还会用。

原文地址:https://www.cnblogs.com/tangge/p/3023724.html