Cookie

学习于 http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html

1.cookie不仅可以存储字符串,还可以存储较复杂的对象:

        private void WriteCookie()
        {
            Person p = new Person { Name = "hp", Age = 30 };
            HttpCookie cookie = new HttpCookie("Mycooike", ToJson(p));
            Response.Cookies.Add(cookie);
        }

        //将对象JSON序列化为字符串
        private String ToJson(Object obj)
        {
            if (obj == null)
            {
                return String.Empty;
            }
            else
            {
                JavaScriptSerializer js = new JavaScriptSerializer();
                return js.Serialize(obj);
            }
        }

        private void ReadCookie()
        {
            HttpCookie cookie = Request.Cookies["Mycooike"];
            if (cookie == null)
            {
                Label1.Text = "null";
            }
            else
            {
                Person p = FromJson(cookie.Value);
                Label1.Text = p.Name;
                Label2.Text = p.Age.ToString();
            }
        }

        //把JSON字符串反序列化对象
        private Person FromJson(String cookieValue)
        {
            if (String.IsNullOrEmpty(cookieValue))
            {
                return null;
            }
            else
            {
                JavaScriptSerializer js = new JavaScriptSerializer();
                return (Person)js.Deserialize(cookieValue, typeof(Person));
            }
        } 

//这种方式产生的有些字符,比如【双引号】,极少数浏览器(Opera)不支持,所以需要做UrlEncode或者Base64编码处理。

2.cookie 与 session的关系

HttpContext类,Page类中都有一个HttpSessionState类的对象叫Session的成员,可以使用它来方便地在服务端保存一些与会话相关的信息。

摘录:HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器端无法区分是不是来源于同一个浏览器。所以,为了实现会话,服务端需要一个会话标识ID能保存到浏览器,让它在后续的请求时都带上这个会话标识ID,以便让服务端知道某个请求属于哪个会话,这样便可以维护与会话相关的状态数据。由于Cookie对于用户来说,是个不可见的东西,而且每次请求都会传递到服务端,所以它就是很理想的会话标识ID的保存容器。在Asp.net中,默认也就是使用Cookie来保存这个ID的。注意:虽然Asp.net 2.0也支持无Cookie的会话,但那种方式要修改URL,也有它的缺点,因此这种方法并没有广泛的使用。

每次浏览器对同一站点访问,只要在后台代码中用到了session对象,则服务端就会为这次访问【会话】(不是为每一个session对象,即使用了多个sessoin对象,它们都属于同一次会话,只有一个session_id)成一个session_id, 且这个session_id保存在cookie中,保存这个session_id的cookie的名字默认是ASP.NET_SessionId【只保存session_id以标识属于哪个会话,并没有保存session中的值,session中的值保存在服务器端】,通过Fiddler工具可以看的到,如果想自定义这个cookie名字,可以在web.config文件里进行设置,如

  <system.web>
      <sessionState mode="InProc" cookieName="tty"></sessionState>
    </system.web>

设置后这个cookie的名字就是tty了,

当第一次进入(访问)站点时,由于cookie的赋值(写入)是在服务端进行的,所以第一次看到这个cookie是在http response-header中看到的,如果在没有退出(离开)该站点的情况下对站点的其他网页进行访问,此时,这个cookie就会在每次的request-header中出现,并随请求一起发送到服务端,且该cookie中的值(即session_id)不变。

3.JS中读写cookie

Cookie并非只能在服务端读写,在客户端的浏览器中也可以实现对它的读写访问, 是通过JS来实现的,且在JS中创建的Cookie对于服务端仍然有效(可见)

 function write1() {
            var cookie1 = "Mycookie=66666666; path=/";
            var cookie2 = "Testcookie=123456789; path=/";
            document.cookie = cookie1;
            document.cookie = cookie2;
        }

//创建了两个cookie

//读取cookie
        function read2() {
            alert(document.cookie);
        }

//HttpCookie有个HttpOnly属性,如果它为true,那么JS是读不到那个Cookie的,也就是说: 我们如果在服务端生成的Cookie不希望在JS中能被访问,可以在写Cookie时,设置这个属性。不过,通过一些工具,还是可以看到它们。

//ASP.NET中记录session id 的那个cookie的HttpOnly属性默认设置是true

//ASP.NET的Forms认证也是依赖cookie来实现的,Asp.net就是每次检查我们在配置文件中指定的Cookie名称,并解密这个Cookie来判断当前请求用户的登录状态。

4.Cookie安全

Cookie中的值都是“一目了然”的,任何人都能看到它们。所以,我们尽量不要直接在Cookie中 保存一些重要的或者敏感的内容。如果我们确实需要使用Cookie保存一些重要的内容,但又不希望被他人看懂, 我们可以使用一些加密的方法来保护这些内容。

 

 

posted on 2012-11-14 22:09  Gcam  阅读(190)  评论(0编辑  收藏  举报

导航