cookie是什么?

存储在客户端浏览器(客户端硬盘)中的一段数据。

cookie的作用?

保存用户的状态信息。(会话跟踪)cookie的主要作用就是用来保存状态的。因为http协议是无状态的,所以要想保存用户的状态信息,必须自己来实现,可以通过cookie来实现。

cookie的特点:

1.保存的数据量大小有限制。
2.cookie可以设置有效期。当把有效期设置为已经过期的日期,那么浏览器就会删除这个cookie.
3.当cookie比较多的时候,浏览器可以自行决定删除某些cookie。
4.用户可以直接通过浏览器清除cookie,所以在程序员编程的时候不要太依赖cookie.
5.因为cookie是存储在客户端的,所有有安全性问题(不要存储密码)。
6.cookie是与域名相关的。所以在下次访问相同域名的网站的时候,浏览器会自动携带该域名下的cookie一起访问。
7.cookie是与浏览器相关的。
8.cookie中保存数据也是以键值对的方式来保存的。
9.如果写入了两个相同的键的cookie,那么后写入的会覆盖先写入的内容。
10.一般情况下,设置cookie,都必须设置有效期,如果不设置有效期,那么这个cookie就是一个浏览器进程内的cookie(在内存中的一个cookie),当以关闭浏览器,则cookie立即失效。


11.可以通过服务器端使用C#语言来写Cookie,也可以通过客户端JavaScript来写cookie,但是无论使用哪种方式,最终都是通过浏览器来操作的cookie。
网页广告总是与你浏览过的商品相似,就是使用了cookie

     HttpCookie UserName1 = Request.Cookies["userName"];
    string val = UserName1.Value;//获取值




    string userName = Request.QueryString["xtxName"];
    //写入cookie
    //1.创建对象
    HttpCookie ck1 = new HttpCookie("userName",userName);
    ck1.Expires = DateTime.Now.AddDays(7);//设置有效期7天
    ck1.Path = "/";//设置在当前网站下的任何一个网页都能访问cookie
    //把ck1加入到cookie集合中,将来当强求结束后,服务器会把cookies集合中的所有的cookie都发送给浏览器
    Response.Cookies.Add(ck1);

会话跟踪技术

cookie  保存在客户端
session 保存在服务器,因此安全
Cookie和Session可以实现跨页面保存用户状态。通过跨页面保存用户状态,就可以跟踪用户访问的页面。

ViewState #

在同一个页面中保存用户状态信息,保存在客户端隐藏域

session

session是基于cookie。asp.net没有cookie,session也可以用
session是存储在服务端的,相对于cookie,session比较安全,但会增加服务器内存的负担
大多数情况下session依赖于cookie,第一次访问页面时,服务器把sessionId发送给浏览器,保存在
浏览器的cookie中,当访问session时,会把cookie里的sessionId发送给服务器找到session对象,因此
浏览器禁用cookie的话session也不能用,但可以通过web.Config配置来使session生效

实现真登录

写一个类继承自page类,因为每个页面都继承自page类
在page_PreInit()中判断session是否为空,这样每个页面再继承这个新类。这样就可以阻止未登录而直接访问页面
在一般处理程序中必须继承IRequiresSessionState接口才可以使用session
session降低系统的性能

模拟持久的sessionId

 if (Request["txtName"]!=null)
    {
        Session["userName"] = Request["txtName"];
        //模拟持久的sessionId
        HttpCookie cksid = new HttpCookie("ASP.NET_SessionId",Session.SessionID);
        cksid.Expires = DateTime.Now.AddDays(7);
        Response.Cookies.Add(cksid);
     }

Session.Abandon();销毁session,放进session池。给下一个用户使用session
Session.Clear();清空session的值

验证码

后台代码

public void ProcessRequest (HttpContext context) {
   //1.生成4位随机数
    Random rnd = new Random();
    string vc = rnd.Next(1000, 10000).ToString();
    //把生成的验证码写到session里

    CreateValidateGraphic(vc, context);
}

public bool IsReusable {
    get {
        return false;
    }
}

/// <summary>
/// 创建验证码的图片
/// </summary>
/// <param name="containsPage">要输出到的page对象</param>
/// <param name="validateNum">验证码</param>
public void CreateValidateGraphic(string validateCode, HttpContext context)
{
    Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);
    Graphics g = Graphics.FromImage(image);
    try
    {
        //生成随机生成器
        Random random = new Random();
        //清空图片背景色
        g.Clear(Color.White);
        //画图片的干扰线
        for (int i = 0; i < 25; i++)
        {
            int x1 = random.Next(image.Width);
            int x2 = random.Next(image.Width);
            int y1 = random.Next(image.Height);
            int y2 = random.Next(image.Height);
            g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
        }
        Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
        System.Drawing.Drawing2D.LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),
         Color.Blue, Color.DarkRed, 1.2f, true);
        g.DrawString(validateCode, font, brush, 3, 2);
        //画图片的前景干扰点
        for (int i = 0; i < 100; i++)
        {
            int x = random.Next(image.Width);
            int y = random.Next(image.Height);
            image.SetPixel(x, y, Color.FromArgb(random.Next()));
        }
        //画图片的边框线
        g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
        //保存图片数据
        MemoryStream stream = new MemoryStream();
        image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
        //输出图片流
        context.Response.Clear();
        context.Response.ContentType = "image/jpeg";
        context.Response.BinaryWrite(stream.ToArray());
    }
    finally
    {
        g.Dispose();
        image.Dispose();
    }
}

前端代码

 <form id="form1" action="valiCode.ashx" method="post">
<table border="1" cellpadding="2" cellspacing="2">
    <tr>
        <td>用户名:
        </td>
        <td>
            <input type="text" name="txtLoginId" value="" /></td>
    </tr>
     <tr>
        <td>密码:
        </td>
        <td>
            <input type="password" name="txtPassword" value="" /></td>
    </tr>
     <tr>
        <td>验证码:
        </td>
        <td>
            <input type="text" name="txtValidCode" maxlength='4' value="" />
            <img id='img1' src="valiCode.ashx" alt="图片验证码" />
            <a href="#" onclick="document.getElementById('img1').src='valiCode.ashx?id='+Math.random()">看不清</a></td>
    </tr>
     <tr>
        <td>
        </td>
        <td>
            <input type="checkbox" name="chkRemember" value="true" />记住</td>
    </tr>
      <tr>
        <td>
        </td>
        <td>
            <input type="submit"  value="登录" /></td>
    </tr>
</table>
</form>
posted on 2017-04-21 16:32  NE_STOP  阅读(0)  评论(0编辑  收藏  举报  来源