6.Cookie
7.Session原理
7.1案例:用Session实现验证码。
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<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("错误"); } }点击图片产生新的验证码。 <img src="YZM.ashx" onclick="this.src='YZM.ashx?aaa='+new Date()" />每次点击都
生成一个新的地址,让浏览器去请求。在AJAX中还会用。