zoukankan      html  css  js  c++  java
  • 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保存一些重要的内容,但又不希望被他人看懂, 我们可以使用一些加密的方法来保护这些内容。

  • 相关阅读:
    Qt Installer Framework翻译(3-4)
    Qt Installer Framework翻译(3-3)
    Qt Installer Framework翻译(3-2)
    Qt Installer Framework翻译(3-1)
    Qt Installer Framework翻译(3-0)
    Qt Installer Framework翻译(0)
    Qt Installer Framework翻译(2)
    Qt Installer Framework翻译(1)
    野生前端的数据结构基础练习(8)——图
    野生前端的数据结构基础练习(7)——二叉树
  • 原文地址:https://www.cnblogs.com/notebook2011/p/2770287.html
Copyright © 2011-2022 走看看