asp.net 10 Cookie & Session

Cookie

1.什么是Cookie

一小段文本,明文的数据,关于网站相关的文本字符串数据.一个客户端状态保持机制~

存储在客户端的浏览器内存里面或者磁盘(如果不指定过期时间,那么存储在客户端浏览器内存中,如果指定了过期时间,那么存储在客户端的磁盘上.)

cookie跟网站有关的,各个网站只能访问跟自己网站相关的cookie(自动执行!?:cookie会随着请求网站一块发送到后台,如果请求百度的时候,那么就把百度的cookie放到请求报文里面去,然后发送到后台!)

 

2.cookie的创建和属性

 cookie的创建:

//Cookie:是一个客户端状态保持机制,(网站的数据是存在客户端),与隐藏域与ViewState对象都属于这种客户端状态保持,Cookie中存储的是关于网站相关的文本字符串数据。Cookie的存储方式有两种,如果不指定过期时间,那么存储在客户端浏览器内存中,如果指定了过期时间,那么存储在客户端的磁盘上。Cookie是与具体的网站有关的,如果我们将Cookie设置了过期时间,那么当用户在指定时间内访问我们的网站,那么属于我们网站的Cookie数据会放在请求报文中发送过来,其它网站的Cookie不会发送。


            //创建Cookie.
            Response.Cookies["cp1"].Value = "itcast";//执行这行代码时,最后会在返回的响应报文的响应头中加上一个Set-Cookie:cp1=itcast;path=/ 返回给浏览器.由于这里没有指定过期时间,所以cookie数据"itcast"默认是存储在浏览器内存中的.
            

            //创建Cookie并且指定过期时间.
            Response.Cookies["cp2"].Value = "laowang";
            Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(3);//指定过期时间

            //删除Cookie
           // Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(-1);


            //Cookie跨域(域名)
            Response.Cookies["cp3"].Value = "laowang";
            Response.Cookies["cp3"].Domain = "xxx.com";//设置主域的。
            /*
             *Cookie的域:浏览器往后台发送数据时候,要把cookie放到请求报文里面去,发送到后台。
             *那么有个问题:请求是子域的网页,那么主域的cookie会不会发送到后台呢?
             *答案:是的。一块发送。如果请求时主域页面,子域的cookie是不会发送到后台的。
             *如果子域想让请求主域页面的时候也一块发送到后台,设置当前Cookie的域为主域可以了。*/
           
            Response.Cookies["cp3"].Path = "/2015-5-31";
            /*
             * cookie可以设置一个Path来限制某个路径下面的页面才会把cookie发送到后台。
             *比如:请求图片,请求一个css、js,为了提高性能,可以通过 path设置页面的所在路径,来控制cookie的发送。
             */

            Response.Cookies["cp3"].Expires = DateTime.Now.AddDays(3);


            //另外一种创建Cookie的方式。
            HttpCookie cookie1 = new HttpCookie("cp4","sssss");
            cookie1.Expires = DateTime.Now.AddDays(3);
            Response.Cookies.Add(cookie1);

cookie的读取:

   //获取Cookie的值
            if (Request.Cookies["cp2"] != null)
            {
                Response.Write(Request.Cookies["cp2"].Value);
            }

 

3.cookie的应用场景

记住登录用户名

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" 
    Inherits="CZBK.ItcastProject.WebApp._2015_5_31.Login" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    用户名:<input type="text" name="txtName"  value="<%=LoginUserName%>"/><br />
        密码;<input type="password" name="txtPwd" /><br />
        <input type="submit" value="登录" />
    </div>
    </form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CZBK.ItcastProject.WebApp._2015_5_31
{
    public partial class Login : System.Web.UI.Page
    {
        public string LoginUserName { get; set; }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                string userName = Request.Form["txtName"];
                //写到Cookie中.
                Response.Cookies["userName"].Value = Server.UrlEncode(userName);
                Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);
               
            }
            else
            {
                //读Cookie。
                if (Request.Cookies["userName"] != null)
                {
                    string name =Server.UrlDecode(Request.Cookies["userName"].Value);
                    LoginUserName = name;
                    Response.Cookies["userName"].Value = Server.UrlEncode(name);
                    Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);
                }
            }
        }
    }
}

 

电商购物车

自动登录

 

4.Cookie图例

****

 

5.Cookie的相关问题

1)大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。

2)浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。

3)有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。

4)Cookie的另外一个创建方法:

//另外一种创建Cookie的方式。
HttpCookie cookie1 = new HttpCookie("cp4","sssss");
cookie1.Expires = DateTime.Now.AddDays(3);
Response.Cookies.Add(cookie1);

5)多值Cookie

Response.Cookies["userInfo"]["userName"] = "patrick";
Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);

HttpCookie aCookie = new HttpCookie("userInfo");
aCookie.Values["userName"] = "patrick";
aCookie.Values["lastVisit"] = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);

 6)控制Cookie范围

默认情况下,一个站点的全部 Cookie 都一起存储在客户端上,而且所有 Cookie 都会随着对该站点发送的任何请求一起发送到服务器。也就是说,一个站点中的每个页面都能获得该站点的所有 Cookie。但是,可以通过两种方式设置 Cookie 的范围:

  • 将 Cookie 的范围限制到服务器上的某个文件夹,这允许您将 Cookie 限制到站点上的某个应用程序。( Cookie 的 Path 属性)

HttpCookie appCookie = new HttpCookie("AppCookie");
appCookie.Value = "written " + DateTime.Now.ToString();
appCookie.Expires = DateTime.Now.AddDays(1);
appCookie.Path = "/Application1";
Response.Cookies.Add(appCookie);
  • 将范围设置为某个域,这允许您指定域中的哪些子域可以访问 Cookie。

Response.Cookies["domain"].Value = DateTime.Now.ToString();
Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);
Response.Cookies["domain"].Domain = "support.contoso.com";

**如果要多个子域共享Cookie,则将子域中的Cookie的Domain值设置为主域的

Response.Cookies["domain"].Value = DateTime.Now.ToString();
Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);
Response.Cookies["domain"].Domain = "contoso.com";

7)读取Cookie (多值Cookie的读取)

if(Request.Cookies["userName"] != null)
    Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value);

if(Request.Cookies["userName"] != null)
{
    HttpCookie aCookie = Request.Cookies["userName"];
    Label1.Text = Server.HtmlEncode(aCookie.Value);
}
if(Request.Cookies["userInfo"] != null)
{
    Label1.Text = 
        Server.HtmlEncode(Request.Cookies["userInfo"]["userName"]);

    Label2.Text =
        Server.HtmlEncode(Request.Cookies["userInfo"]["lastVisit"]);
}
if(Request.Cookies["userInfo"] != null)
{
    System.Collections.Specialized.NameValueCollection
        UserInfoCookieCollection;
       
    UserInfoCookieCollection = Request.Cookies["userInfo"].Values;
    Label1.Text = 
        Server.HtmlEncode(UserInfoCookieCollection["userName"]);
    Label2.Text =
        Server.HtmlEncode(UserInfoCookieCollection["lastVisit"]);
}

8)修改和删除Cookie

删除Cookie,实际上是修改Cookie的生存时间:

Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(-1);

修改Cookie的本质:创建一个具有新值的新 Cookie,然后将其发送到浏览器来覆盖客户端上的旧版本 Cookie

9)Cookie的不安全

因为Cookie存在客户端的,所以不安全,加密!一些不重要的信息

10)确定浏览器是否接受Cookie

确定 Cookie 是否被接受的一种方法是尝试编写一个 Cookie,然后再尝试读取该 Cookie。如果无法读取您编写的 Cookie,则可以假定浏览器不接受 Cookie。

第一个页面:设置一个TestCookie,然后跳转到第二个页面

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        if (Request.QueryString["AcceptsCookies"] == null)
        {
            Response.Cookies["TestCookie"].Value = "ok";
            Response.Cookies["TestCookie"].Expires =
                DateTime.Now.AddMinutes(1);
            Response.Redirect("TestForCookies.aspx?redirect=" +
                Server.UrlEncode(Request.Url.ToString()));
        }
        else
        {
            Label1.Text = "Accept cookies = " +
                Server.UrlEncode(
                Request.QueryString["AcceptsCookies"]);
        }
    }
}

第二个页面:

protected void Page_Load(object sender, EventArgs e)
{
    string redirect = Request.QueryString["redirect"];
    string acceptsCookies;
    if(Request.Cookies["TestCookie"] ==null)
        acceptsCookies = "no";
    else
    {
        acceptsCookies = "yes";
        // Delete test cookie.
        Response.Cookies["TestCookie"].Expires = 
            DateTime.Now.AddDays(-1);
    }
    Response.Redirect(redirect + "?AcceptsCookies=" + acceptsCookies,
    true);
}

 

 

Session

posted @ 2018-07-25 16:49  youguess  阅读(156)  评论(0编辑  收藏  举报