您的位置:首页 > 理论基础 > 计算机网络

http相关知识 - (2)状态管理 - cookie

2017-02-20 21:43 483 查看

http相关知识 - (2)状态管理 - cookie

1.http协议与状态保持

(1)Http协议本身是无状态的,每次的请求都是独立的,执行情况和前面的请求和之后的请求都没有直接关系。

(2)网络协议状态:

web应用:有状态

http:无状态

TCP:有状态

IP:无状态

但是我们的有状态的web应用是基于http(无状态)的,这样就造成想要完成有状态的web应用,就需要加上可以记录状态的机制。

2.web应用程序状态管理

a. 表单隐藏字段

b. cookie

c. session

d. URL地址重写

3.cookie

(1)cookie机制的基本原理:服务器在响应请求时将一些数据以“键-值”对的形式通过响应信息保存在客户端,当浏览器再次访问相同的应用时,会将原先的Cookie通过请求信息带到服务器端。

(2)正统的cookie分发是通过扩展http协议来实现的,服务器在HTTP的响应
4000
头中加上一行特殊的指示以提示浏览器按照指示生成响应的cookie,在客户端也可以生成cookie。

(3)cookie的主要内容:

         1. 名称 Name

        2. 值 Value

        3. 域 Domain 属性的默认值为当前URL的域名部分,不管发出这个cookie的页面在哪个目录下的。

        4. 路径 Path : Path属性的默认值是根目录,即 ”/” ,不管发出这个cookie的页面在哪个目录下的。可以由程序设置为一定的路径来进一步限制此cookie的作用范围。

        5. 失效日期 Expires : 这个属性设置此Cookie 的过期日期和时间。如果没有设置Cookie 的有效期(默认设置),也可以创建 Cookie,但它不会保存到用户的硬盘上,而是会成为用户会话信息的一部分,关闭浏览器或会话超时这个Cookie即会消失,这种Cookie称作非永久性的 Cookie。存放SessionID的Cookie就是这样的一种Cookie,它不存放在硬盘上,只存在内存之中.

        6. 安全标志 Secure : 当secure属性设置为true时,cookie只有在https协议下才能上传到服务器,而在http协议下是没法上传的,所以也不会被窃听.

        7. HttpOnly 仅服务器端 : 通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击.

(4)cookie 类型

         1. 普通cookie: 服务端和js都可以创建,都可以访问。

         2. HttpOnly cookie: 只能由服务端创建,JS无法读取。

         3. 安全的cookie(https): 服务端和JS都可以创建,JS仅在HTTPS下访问。

(5) cookie的操作

前端:

1. JS操作cookie:

//写cookies 
function setCookie(name,value) 
{ 
    var Days = 30; 
    var exp = new Date(); 
    exp.setTime(exp.getTime() + Days*24*60*60*1000); 
    document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); 
} 

//读取cookies 
function getCookie(name) 
{ 
    var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
 
    if(arr=document.cookie.match(reg))
 
        return unescape(arr[2]); 
    else 
        return null; 
} 

//删除cookies 
function delCookie(name) 
{ 
    var exp = new Date(); 
    exp.setTime(exp.getTime() - 1); 
    var cval=getCookie(name); 
    if(cval!=null) 
        document.cookie= name + "="+cval+";expires="+exp.toGMTString(); 
} 

2. Jquery操作cookie: 

//创建cookie
$.cookie('the_cookie', 'the_value', { expires: 7 });

//读取cookie: 
$.cookie('the_cookie');

//删除cookie
$.cookie('the_cookie', null);


服务端(C#)
/// <summary>
    /// Set cookie.
    /// </summary>
    private void SetCookie()
    {
        Response.Cookies["username"].Value = "Rod";
        Response.Cookies["username"].Expires = DateTime.Now.AddDays(1); 
    }

    /// <summary>
    /// Get cookie.
    /// </summary>
    private string GetCookie()
    {
        if (Request.Cookies["username"] != null)
        {
            return Request.Cookies["username"].Value;
        }

        return null;
    }

    /// <summary>
    /// Delete cookie.
    /// </summary>
    private void DelCookie()
    {
        HttpCookie cookie = Request.Cookies["username"];
        if (cookie != null)
        {
            cookie.Expires = DateTime.Now.AddDays(-1);
            Response.Cookies.Set(cookie);

        }
    }


(6) cookie案例

a. js添加cookie
var Days = 30;
var exp = new Date();
exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
document.cookie = "Companay=" + escape("Argument") +
";Domain" + "= localhost" +
";Path" + "= /Http" +
";expires=" + exp.toGMTString() +";";


然后在chorme查看cookie的值,可以查看到在localhost:30403/Http拥有一个名为Company的cookie,但是这个cookie只是属于/Http.



为了验证上面的问题:我们退回到根目录下: localhost:30403,此时这个页面下是没有cookie的。



b. fillder截取http查看cookie: 从下图中可以看到发送到server端的cookie只有key,value。



c. server查看cookie: 在server端只有key和value,因为对于cookie,在server端,有cookie就有cookie,如果js端已经过期的cookie就不会存在,更不会发送到server端,path的值始终是“/”。

                                         


d. server添加两个新的cookie:希望大家着重看一下四个属性值,他们的值不同。
    HttpCookie cookie1 = new HttpCookie("Name", "rod chen");
            cookie1.Expires = DateTime.Now.AddDays(1);
            cookie1.Path = "/";
            cookie1.HttpOnly = true;
            cookie.Secure = true;

            HttpCookie cookie2 = new HttpCookie("Name1", "rod chen1");
            cookie2.Expires = DateTime.Now.AddDays(2);
            cookie2.Path = "/Http";
            cookie2.HttpOnly = false;
            cookie2.Secure = false;

            Response.Cookies.Add(cookie1);
            Response.Cookies.Add(cookie2);


e. fillder截取response:从response中可以看到我们新加的cookie,以Set-cookie的http扩展形式返回到客户端。注意我们在server加的属性serure在这个地方没有返回,因为我们的应用程序是基于http协议的,而不是https协议的。



d. 接下来在客户端看一下我们新加的cookie,刷新一下页面可以看到我们新加的两个cookie,以及我们自己设置的属性。此时我们打开控制台看一下前端能够拿到的cookie。



可以看到在前端我们只可以看到两个cookie,因为我们新加的key为Name的cookie是设置httponly,就是在server端我们才可以看到,这个我们会在后面去看到,这里给大家留一个问题好了,如果我调回根目录页面,我们还可以看到几个cookie,console台还可以拿到几个cookie。

                                  


e. 我们在发一个请求去看一下现在发送到server的cookie有几个。三个,客户端可以操作的两个cookie加上一个在server才可以操作的cookie。



Note: 对于cookie的总结会在后面和session一起说明一下!有不正之处欢迎批评指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: