精华内容
下载资源
问答
  • 主要介绍了sessioncookie作用原理,区别和用法,以及使用过程中优缺点,通过列举区别和原理,使读者更能理解两者之间关系,需要朋友可以参考下
  • 路由器交换机的区别?路由器的作用和工作原理! 第一监控 18-03-3022:30 我们继续第一监控系列网络知识的分享,前面写了两篇原创,介绍了以太网以太网交换机,交换机的转发原理。 1,以太网交换机 2,...

    路由器和交换机的区别?路由器的作用和工作原理!

    第一监控

    18-03-3022:30

    我们继续第一监控系列网络知识的分享,前面写了两篇原创,介绍了以太网和以太网交换机,交换机的转发原理。

    1,以太网和交换机

    2,交换机转发原理

    我们这里纯粹是知识分享,看完文章你可能都懂了,但是去考专业考试肯定不行的哈,因为我们忽略了很多记忆的东西。

     

    上次我们说到网络七层模型,几乎所有的网络专业课程都会从要求你记住每层的名字和当中包含的协议开始的,但是我们只是用到哪层,看看这张图就可以了。

    从低到高,1-4层称为底层,5-7称为高层,每层都有自己负责的工作,然后把指令传到上一层。

     

    比如第一层,物理层,顾名思义,就是物理连接层了,我们弱电安防人接触的最多了,网线、光纤、网卡等这些前期工作都是物理层的工作了。

     

    第二层,数据链路层,是同步数据,指定MAC方法。最常见的链路层的设备就是交换机了。

     

    第三层,网络层,指定地址,选择传送路径。路由器工作在网络层。第四层到第七层分别是传输层、会话层、表示层、应用层。

     

    我们通过上面的网络模型,引出路由器的概念。

    路由器(Router),是连接网络中各种不同设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。

     

    路由器是互联网络的枢纽,目前路由器已经广泛应用于各行各业,各种不同档次的产品已成为实现互联网互联互通业务的主力军。

    那交换机和路由器有什么区别呢?

    两者都是连接互联网的设备,它们之间主要区别就是,交换机发生在网络的第二层数据链路层,而路由器发生在第三层网络层。这个区别是两者各自工作方式的根本区别。路由器可以根据IP地址寻找下一个设备,可以处理TCPIP协议,而上一篇我们讲过交换机是根据MAC地址寻址的。

     

    交换机是分配网络数据,路由器可以给网络分配IP地址,分配给你地址而且可以随时通过地址过来找到你。

     

    路由器可以在不同时间内把一个IP分配给多台主机使用。交换机是通过MAC地址和识别各个不同的主机。

     

    路由器的工作原理是怎么样的呢?前面我们知道了交换机有MAC地址表,自动生成自动学习,同样的,路由器也有个路由表,会自己学习、生成、维护路由表。

     

    我们举一个简单的例子,只要能看懂就可以了,不上图了:

     

    1,主机A准备发数据给主机B。

     

    2,A将B的IP地址连同数据一起,以数据包形式发送给路由器R1。

     

    3,路由器R1收到数据包后,先从数据中读取到B的IP地址,然后根据路径表计算发往B的最优路径。

     

    4,比如路径为:R1->R2->R5->B;并将数据包发往路由器R2。

     

    5,路由器2重复路由器1的工作,并将数据包转发给路由器5。

     

    6,路由器5同样取出目的地址,发现目的地址就在自己的网段上,于是将该数据包直接交给主机B。

     

    7,主机B收到主机A的信息,一次完整的通信宣告结束。

     

    今天分享就到这里,也希望大家多多分享。

    展开全文
  • 1、cookie的作用: 我们在浏览器中,经常涉及到数据交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息呢,答案就是今天主角cookie了,...

    1、cookie的作用:

    我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。

    2、机制的区别:

    session机制采用的是在服务器端保持状态的方案,而cookie机制则是在客户端保持状态的方案,cookie又叫会话跟踪机制。打开一次浏览器到关闭浏览器算是一次会话。说到这里,讲下HTTP协议,前面提到,HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。此时,服务器无法从链接上跟踪会话。cookie可以跟踪会话,弥补HTTP无状态协议的不足。

    3、cookie的分类:

    cookie分为会话cookie和持久cookie,会话cookie是指在不设定它的生命周期expires时的状态,前面说了,浏览器的开启到关闭就是一次会话,当关闭浏览器时,会话cookie就会跟随浏览器而销毁。当关闭一个页面时,不影响会话cookie的销毁。会话cookie就像我们没有办理积分卡时,单一的买卖过程,离开之后,信息则销毁。

    持久cookie则是设定了它的生命周期expires,此时,cookie像商品一样,有个保质期,关闭浏览器之后,它不会销毁,直到设定的过期时间。对于持久cookie,可以在同一个浏览器中传递数据,比如,你在打开一个淘宝页面登陆后,你在点开一个商品页面,依然是登录状态,即便你关闭了浏览器,再次开启浏览器,依然会是登录状态。这就是因为cookie自动将数据传送到服务器端,在反馈回来的结果。持久cookie就像是我们办理了一张积分卡,即便离开,信息一直保留,直到时间到期,信息销毁。


    4、简单的使用cookie的代码

    cookie的几种常见属性:document.cookie="key=value;expires=失效时间;path=路径;domain=域名;secure;(secure表安全级别),

    cookie以字符串的形式保存在浏览器中。下面贴段代码出来,是一个类似购物网站的将商品添加到购物车,再从购物车还原商品信息的过程,是自己用原生JS封装的函数。

    封装的cookie的存入,读取以及删除的函数:(这里是将信息以对象的形式存放到cookie中的,会用到JSON的知识)


    // key : cookie 名
    // value : cookie 值
    // options : 可选配置参数
    //        options = {
    //            expires : 7|new Date(), // 失效时间
    //            path : "/", // 路径
    //            domain : "", // 域名
    //            secure : true // 安全连接
    //        }
    function cookie(key, value, options) {
        /* read 读取 */
        // 如果没有传递 value ,则表示根据 key 读取 cookie 值
        if (typeof value === "undefined") { // 读取
            // 获取当前域下所有的 cookie,保存到 cookies 数组中
            var cookies = document.cookie.split("; ");
            // 遍历 cookies 数组中的每个元素
            for (var i = 0, len = cookies.length; i < len; i++) {
                // cookies[i] : 当前遍历到的元素,代表的是 "key=value" 意思的字符串,
                // 将字符串以 = 号分割返回的数组中第一个元素表示 key,
                // 第二个元素表示 value
                var cookie = cookies[i].split("=");
                // 判断是否是要查找的 key,对查找的 key 、value 都要做解码操作
                if (decodeURIComponent(cookie[0]) === key) {
                    return decodeURIComponent(cookie[1]);
                }
            }
            // 没有查找到指定的 key 对应的 value 值,则返回 null
            return null;
        }
     
        /* 存入 设置 */
        // 设置 options 默认为空对象
        options = options || {};
        // key = value,对象 key,value 编码
        var cookie = encodeURIComponent(key) + "=" + encodeURIComponent(value);
        // 失效时间
        if ((typeof options.expires) !== "undefined") { // 有配置失效时间
            if (typeof options.expires === "number") { // 失效时间为数字
                var days = options.expires, 
                    t = options.expires = new Date();
                t.setDate(t.getDate() + days);
            } 
            cookie += ";expires=" + options.expires.toUTCString();
        }
        // 路径
        if (typeof options.path !== "undefined")
            cookie += ";path=" + options.path;
        // 域名
        if (typeof options.domain !== "undefined")
            cookie += ";domain=" + options.domain;
        // 安全连接
        if (options.secure)
            cookie += ";secure";
     
        // 保存
        document.cookie = cookie;
    }
     
    // 从所有的 cookie 中删除指定的 cookie
    function removeCookie(key, options) {
        options = options || {};
        options.expires = -1; // 将失效时间设置为 1 天前
        cookie(key, "", options);
    }

    下面是商品详情页的JS代码

    // 找到所有的 “添加到购物车” 超级链接
                var links = $("a", $("#tab"));
                // 循环,为每个 “添加到购物车” 的超级链接添加点击事件
                for (var i = 0, len = links.length; i < len; i++) {
                    links[i].onclick = function(){
                        // 获取当前超级链接所在行的所有单元格
                        var _cells = this.parentNode.parentNode.cells;
                        // 获取到即将添加到购物车中的商品信息
                        var _id = _cells[0].innerHTML,
                            _name = _cells[1].innerHTML,
                            _price = _cells[2].innerHTML;
                        // 将商品信息包装到一个对象中
                        var product = {
                            id : _id,
                            name : _name,
                            price : _price,
                            amount : 1
                        };
     
                        /* 将当前选购的商品对象保存到 cookie 中去 */
                        // 从 cookie 中读取已有的保存购物车的数组结构
                        var _products = cookie("products");
                        if (_products === null) // cookie 中不存在 products 名的 cookie
                            _products = [];
                        else // 存在,则解析 cookie 读取到的字符串为 数组 结构
                            _products = JSON.parse(_products);
     
                        // 将当前选购的商品追加到数组中保存
                        _products.push(product);
                        // 继续将 _products 数组内容存回 cookie
                        cookie("products", JSON.stringify(_products), {expires:7});
                    }
                }
    html代码,css代码大家可以自己写

    <table id="tab">
            <tr>
                <td>序号</td>
                <td>名称</td>
                <td>价格</td>
                <td>操作</td>
            </tr>
            <tr>
                <td>1</td>
                <td>空调</td>
                <td>3999</td>
                <td><a href="javascript:void(0);">添加到购物车</a></td>
            </tr>
            <tr>
                <td>2</td>
                <td>风扇</td>
                <td>288</td>
                <td><a href="javascript:void(0);">添加到购物车</a></td>
            </tr>
        </table>
        <a href="cart_购物车.html" target="_blank">查看购物车</a>

    购物车还原商品信息:

    // 从 cookie 中读取购物车已有的商品信息
                var _products = cookie("products");
                // 判断购物车是否有商品
                if (_products === null || (_products = JSON.parse(_products)).length === 0)
                    return;
     
                // 如果有商品,则显示到页面中
                $(".result")[0].innerHTML = "";
                for (var i = 0, len = _products.length; i < len; i++) {
                    // 当前遍历到的商品对象
                    var prod = _products[i];
                    // 克隆 .row 的节点
                    var _row = $(".row")[0].cloneNode(true);
                    // 将当前商品对象的信息替换节点中对应的部分,用class名获取到的节点返回类型是一个数组所以要在后面加上[0]
                    $(".index", _row)[0].innerHTML = prod.id; // 编号
                    $(".name", _row)[0].innerHTML = prod.name; // 名称
                    $(".price", _row)[0].innerHTML = prod.price; // 价格
                    $(".amount", _row)[0].innerHTML = prod.amount; // 数量
                    $(".oper", _row)[0].innerHTML = "<a href='javascript:void(0);'>删除</a>"
     
                    // 将克隆的节点副本追加到 .result 的 div 中
                    $(".result")[0].appendChild(_row);
                };
     
                // 为每个 “删除” 的超级链接绑定点击事件
                var links = $("a", $("#container"));
                for (var i = 0, len = links.length; i < len; i++) {
                    // links[i].index = i; // 为当前遍历到的超级链接附加数据
                    links[i].product = _products[i]; // 
                    links[i].onclick = function(){
                        // alert("你点击的是第" + (this.index + 1) + "个连接");
                        var index = inArray(this.product, _products);
                        
                        if (index !== -1) {
                            _products.splice(index, 1);
                        }
                        // 更新 cookie
                        cookie("products", JSON.stringify(_products), {expires:7});
     
                        // 找出页面中待删除的行
                        var _row = this.parentNode.parentNode;
                        _row.parentNode.removeChild(_row);
                    };
                }
    这里的$(' ')函数是自己封装的函数,用于获取到DOM节点,可以看下我关于getElementsByClassName的兼容那篇文章。
    购物车的html代码


    <div id="container">
            <div class="row">
                <div class="index">商品编号</div>
                <div class="name">商品名称</div>
                <div class="price">价格</div>
                <div class="amount">数量</div>
                <div class="oper">操作</div>
            </div>
            <div class="result" style="clear:both;">
                购物车为空
            </div>
        </div>

    --------------------- 
    作者:web_emmet 
    来源:CSDN 
    原文:https://blog.csdn.net/u014753892/article/details/52821268 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 1、cookie的作用: 我们在浏览器中,经常涉及到数据交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息呢,答案就是今天主角cookie了,Cookie...

    1、cookie的作用:

    我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。

    2、机制的区别:

    session机制采用的是在服务器端保持状态的方案,而cookie机制则是在客户端保持状态的方案,cookie又叫会话跟踪机制。打开一次浏览器到关闭浏览器算是一次会话。说到这里,讲下HTTP协议,前面提到,HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。此时,服务器无法从链接上跟踪会话。cookie可以跟踪会话,弥补HTTP无状态协议的不足。

    3、cookie的分类:

    cookie分为会话cookie和持久cookie,会话cookie是指在不设定它的生命周期expires时的状态,前面说了,浏览器的开启到关闭就是一次会话,当关闭浏览器时,会话cookie就会跟随浏览器而销毁。当关闭一个页面时,不影响会话cookie的销毁。会话cookie就像我们没有办理积分卡时,单一的买卖过程,离开之后,信息则销毁。

    持久cookie则是设定了它的生命周期expires,此时,cookie像商品一样,有个保质期,关闭浏览器之后,它不会销毁,直到设定的过期时间。对于持久cookie,可以在同一个浏览器中传递数据,比如,你在打开一个淘宝页面登陆后,你在点开一个商品页面,依然是登录状态,即便你关闭了浏览器,再次开启浏览器,依然会是登录状态。这就是因为cookie自动将数据传送到服务器端,在反馈回来的结果。持久cookie就像是我们办理了一张积分卡,即便离开,信息一直保留,直到时间到期,信息销毁。

    4、简单的使用cookie的代码

    cookie的几种常见属性:document.cookie="key=value;expires=失效时间;path=路径;domain=域名;secure;(secure表安全级别),

    cookie以字符串的形式保存在浏览器中。下面贴段代码出来,是一个类似购物网站的将商品添加到购物车,再从购物车还原商品信息的过程,是自己用原生JS封装的函数。

    封装的cookie的存入,读取以及删除的函数:(这里是将信息以对象的形式存放到cookie中的,会用到JSON的知识)

    // key : cookie 名
    // value : cookie 值
    // options : 可选配置参数
    // options = {
    // expires : 7|new Date(), // 失效时间
    // path : “/”, // 路径
    // domain : “”, // 域名
    // secure : true // 安全连接
    // }
    function cookie(key, value, options) {
    /* read 读取 */
    // 如果没有传递 value ,则表示根据 key 读取 cookie 值
    if (typeof value === “undefined”) { // 读取
    // 获取当前域下所有的 cookie,保存到 cookies 数组中
    var cookies = document.cookie.split("; “);
    // 遍历 cookies 数组中的每个元素
    for (var i = 0, len = cookies.length; i < len; i++) {
    // cookies[i] : 当前遍历到的元素,代表的是 “key=value” 意思的字符串,
    // 将字符串以 = 号分割返回的数组中第一个元素表示 key,
    // 第二个元素表示 value
    var cookie = cookies[i].split(”=");
    // 判断是否是要查找的 key,对查找的 key 、value 都要做解码操作
    if (decodeURIComponent(cookie[0]) === key) {
    return decodeURIComponent(cookie[1]);
    }
    }
    // 没有查找到指定的 key 对应的 value 值,则返回 null
    return null;
    }

    /* 存入 设置 */
    // 设置 options 默认为空对象
    options = options || {};
    // key = value,对象 key,value 编码
    var cookie = encodeURIComponent(key) + "=" + encodeURIComponent(value);
    // 失效时间
    if ((typeof options.expires) !== "undefined") { // 有配置失效时间
    	if (typeof options.expires === "number") { // 失效时间为数字
    		var days = options.expires, 
    			t = options.expires = new Date();
    		t.setDate(t.getDate() + days);
    	} 
    	cookie += ";expires=" + options.expires.toUTCString();
    }
    // 路径
    if (typeof options.path !== "undefined")
    	cookie += ";path=" + options.path;
    // 域名
    if (typeof options.domain !== "undefined")
    	cookie += ";domain=" + options.domain;
    // 安全连接
    if (options.secure)
    	cookie += ";secure";
    // 保存
    document.cookie = cookie;
    

    }
    // 从所有的 cookie 中删除指定的 cookie
    function removeCookie(key, options) {
    options = options || {};
    options.expires = -1; // 将失效时间设置为 1 天前
    cookie(key, “”, options);
    }

    下面是商品详情页的JS代码
    // 找到所有的 “添加到购物车” 超级链接
    var links = $(“a”, $("#tab"));
    // 循环,为每个 “添加到购物车” 的超级链接添加点击事件
    for (var i = 0, len = links.length; i < len; i++) {
    links[i].onclick = function(){
    // 获取当前超级链接所在行的所有单元格
    var _cells = this.parentNode.parentNode.cells;
    // 获取到即将添加到购物车中的商品信息
    var _id = _cells[0].innerHTML,
    _name = _cells[1].innerHTML,
    _price = _cells[2].innerHTML;
    // 将商品信息包装到一个对象中
    var product = {
    id : _id,
    name : _name,
    price : _price,
    amount : 1
    };

    				/* 将当前选购的商品对象保存到 cookie 中去 */
    				// 从 cookie 中读取已有的保存购物车的数组结构
    				var _products = cookie("products");
    				if (_products === null) // cookie 中不存在 products 名的 cookie
    					_products = [];
    				else // 存在,则解析 cookie 读取到的字符串为 数组 结构
    					_products = JSON.parse(_products);
    
    				// 将当前选购的商品追加到数组中保存
    				_products.push(product);
    				// 继续将 _products 数组内容存回 cookie
    				cookie("products", JSON.stringify(_products), {expires:7});
    			}
    		}
    

    html代码,css代码大家可以自己写

    序号 名称 价格 操作
    1 空调 3999 添加到购物车
    2 风扇 288 添加到购物车
    查看购物车

    购物车还原商品信息:

    // 从 cookie 中读取购物车已有的商品信息
    var _products = cookie(“products”);
    // 判断购物车是否有商品
    if (_products === null || (_products = JSON.parse(_products)).length === 0)
    return;

    		// 如果有商品,则显示到页面中
    		$(".result")[0].innerHTML = "";
    		for (var i = 0, len = _products.length; i < len; i++) {
    			// 当前遍历到的商品对象
    			var prod = _products[i];
    			// 克隆 .row 的节点
    			var _row = $(".row")[0].cloneNode(true);
    			// 将当前商品对象的信息替换节点中对应的部分,用class名获取到的节点返回类型是一个数组所以要在后面加上[0]
    			$(".index", _row)[0].innerHTML = prod.id; // 编号
    			$(".name", _row)[0].innerHTML = prod.name; // 名称
    			$(".price", _row)[0].innerHTML = prod.price; // 价格
    			$(".amount", _row)[0].innerHTML = prod.amount; // 数量
    			$(".oper", _row)[0].innerHTML = "<a href='javascript:void(0);'>删除</a>"
    
    			// 将克隆的节点副本追加到 .result 的 div 中
    			$(".result")[0].appendChild(_row);
    		};
    
    		// 为每个 “删除” 的超级链接绑定点击事件
    		var links = $("a", $("#container"));
    		for (var i = 0, len = links.length; i < len; i++) {
    			// links[i].index = i; // 为当前遍历到的超级链接附加数据
    			links[i].product = _products[i]; // 
    			links[i].onclick = function(){
    				// alert("你点击的是第" + (this.index + 1) + "个连接");
    				var index = inArray(this.product, _products);
    				
    				if (index !== -1) {
    					_products.splice(index, 1);
    				}
    				// 更新 cookie
    				cookie("products", JSON.stringify(_products), {expires:7});
    
    				// 找出页面中待删除的行
    				var _row = this.parentNode.parentNode;
    				_row.parentNode.removeChild(_row);
    			};
    		}
    

    这里的$(’ ')函数是自己封装的函数,用于获取到DOM节点,可以看下我关于getElementsByClassName的兼容那篇文章。
    购物车的html代码

    商品编号
    商品名称
    价格
    数量
    操作
    购物车为空

    ————————————————
    版权声明:本文为CSDN博主「web_emmet」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u014753892/article/details/52821268

    展开全文
  • 电压互感器电流互感器在作用原理的区别  主要区别是正常运行时工作状态大不相同,主要表现为:  1)电流互感器二次可以短路,但是不得开路;电压互感器二次 可以开路,但是不得短路  2)对于二次侧的负荷来说...
  • 一、cookie机制session机制的区别  具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。  同时我们也看到,由于在服务器端保持状态的方案在客户端也需要保存一...

    一、cookie机制和session机制的区别
      具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
      同时我们也看到,由于在服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择。

    二、会话cookie和持久cookie的区别
      如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
      如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
      存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。

    三、如何利用实现自动登录
      当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源。

    四、如何根据用户的爱好定制站点
      网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。

    五、cookie的发送
    1.创建Cookie对象
    2.设置最大时效
    3.将Cookie放入到HTTP响应报头
    如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该 cookie。
      发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个 Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而非setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。

    六、cookie的读取
    1.调用request.getCookie
      要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。
    2.对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止
      cookie与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。
    例如:
      String cookieName = “userID”;
    Cookie cookies[] = request.getCookies();
    if (cookies!=null){
    for(int i=0;i
    Cookie cookie = cookies[i];
    if (cookieName.equals(cookie.getName())){
    doSomethingWith(cookie.getValue());
    }
    }
    }

    七、如何使用cookie检测初访者
    A.调用HttpServletRequest.getCookies()获取Cookie数组
    B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确
    C.如果是则退出循环并设置区别标识
    D.根据区别标识判断用户是否为初访者从而进行不同的操作

    八、使用cookie检测初访者的常见错误
      不能仅仅因为cookie数组中不存在在特定的数据项就认为用户是个初访者。如果cookie数组为null,客户可能是一个初访者,也可能是由于用户将cookie删除或禁用造成的结果。
    但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾经访问过你的servlet。其它servlet、JSP页面以及非Java Web应用都可以设置cookie,依据路径的设置,其中的任何cookie都有可能返回给用户的浏览器。
      正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。

    九、使用cookie属性的注意问题
      属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器的报头。 
      因此除了名称和值之外,cookie属性只适用于从服务器输出到客户端的cookie;服务器端来自于浏览器的cookie并没有设置这些属性。 
    因而不要期望通过request.getCookies得到的cookie中可以使用这个属性。这意味着,你不能仅仅通过设置cookie的最大时效,发出它,在随后的输入数组中查找适当的cookie,读取它的值,修改它并将它存回Cookie,从而实现不断改变的cookie值。

    十、如何使用cookie记录各个用户的访问计数
    1.获取cookie数组中专门用于统计用户访问次数的cookie的值
    2.将值转换成int型
    3.将值加1并用原来的名称重新创建一个Cookie对象
    4.重新设置最大时效
    5.将新的cookie输出

    十一、session在不同环境下的不同含义
      session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。
      然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义。
      session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。

    十二、session的机制
      session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
    但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识-称为session id,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
      如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。

    十三、保存session id的几种方式
    A.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
    B.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
    C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

    十四、session什么时候被创建
      一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。

    十五、session何时被删除
    session在下列情况下被删除:
    A.程序调用HttpSession.invalidate()
    B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
    C.服务器进程被停止
      再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

    十六、URL重写有什么缺点
      对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。
    这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或 JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。  

    十七、使用隐藏的表单域有什么缺点
    仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程

    十八、会话跟踪的基本步骤
    1.访问与当前请求相关的会话对象
    2.查找与会话相关的信息
    3.存储会话信息
    4.废弃会话数据

    十九、getSession()/getSession(true)、getSession(false)的区别
    getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象
    getSession(false):当session存在时返回该session,否则不会新建session,返回null

    二十、如何将信息与会话关联起来
      setAttribute会替换任何之前设定的值;如果想要在不提供任何代替的情况下移除某个值,则应使用removeAttribute。这个方法会触发所有实现了HttpSessionBindingListener接口的值的valueUnbound方法。

    二十一、会话属性的类型有什么限制吗
      通常会话属性的类型只要是Object就可以了。除了null或基本类型,如int,double,boolean。
      如果要使用基本类型的值作为属性,必须将其转换为相应的封装类对象

    二十二、如何废弃会话数据
    A.只移除自己编写的servlet创建的数据:
    调用removeAttribute(“key”)将指定键关联的值废弃
    B.删除整个会话(在当前Web应用中):
    调用invalidate,将整个会话废弃掉。这样做会丢失该用户的所有会话数据,而非仅仅由我们servlet或JSP页面创建的会话数据
    C.将用户从系统中注销并删除所有属于他(或她)的会话
    调用logOut,将客户从Web服务器中注销,同时废弃所有与该用户相关联的会话(每个Web应用至多一个)。这个操作有可能影响到服务器上多个不同的Web应用。

    二十三、使用isNew来判断用户是否为新旧用户的错误做法
      public boolean isNew()方法如果会话尚未和客户程序(浏览器)发生任何联系,则这个方法返回true,这一般是因为会话是新建的,不是由输入的客户请求所引起的。
      但如果isNew返回false,只不过是说明他之前曾经访问该Web应用,并不代表他们曾访问过我们的servlet或JSP页面。
      因为session是与用户相关的,在用户之前访问的每一个页面都有可能创建了会话。因此isNew为false只能说用户之前访问过该Web应用,session可以是当前页面创建,也可能是由用户之前访问过的页面创建的。
      正确的做法是判断某个session中是否存在某个特定的key且其value是否正确

    二十四、Cookie的过期和Session的超时有什么区别
    会话的超时由服务器来维护,它不同于Cookie的失效日期。首先,会话一般基于驻留内存的cookie不是持续性的cookie,因而也就没有截至日期。即使截取到JSESSIONID cookie,并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。

    二十五、session cookie和session对象的生命周期是一样的吗
      当用户关闭了浏览器虽然session cookie已经消失,但session对象仍然保存在服务器端

    二十六、是否只要关闭浏览器,session就消失了
      程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。
      之所以会有这种错误的认识,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。
      如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session。
      恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。
      由此我们可以得出如下结论:
      关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。

    二十七、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
      通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。
    此时我们可以先把session id保存在persistent cookie中(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookie和persistent cookie的结合我们就可以实现了跨窗口的会话跟踪。

    二十八、如何使用会话显示每个客户的访问次数
      由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值
      但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来代替之前存在的老的属性的值。例如:
    HttpSession session = request.getSession();
    SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);
    if (value= =null){
    value = new SomeImmutableClass(…); // 新创建一个不可更改对象
    }else{
    value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象
    }
    session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象

    二十九、如何使用会话累计用户的数据
      使用可变的数据结构,比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式,除非首次分配对象,否则不需要调用setAttribute。例如
    HttpSession session = request.getSession();
    SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);
    if(value = = null){
    value = new SomeMutableClass(…);
    session.setAttribute(“someIdentifier”,value);
    }else{
    value.updateInternalAttribute(…); // 如果已经存在该对象则更新其属性而不需重新设置属性
    }

    三十、不可更改对象和可更改对象在会话数据更新时的不同处理
    不可更改对象因为一旦创建之后就不能更改,所以每次要修改会话中属性的值的时候,都需要调用 setAttribute(“someIdentifier”,newValue)来代替原有的属性的值,否则属性的值不会被更新可更改对象因为其自身一般提供了修改自身属性的方法,所以每次要修改会话中属性的值的时候,只要调用该可更改对象的相关修改自身属性的方法就可以了。这意味着我们就不需要调用 setAttribute方法了。

    原文:https://blog.csdn.net/jzhf2012/article/details/8496502 
     

    展开全文
  • 描述CookieSession的作用区别和各自应用范围,cookie、Session工作原理 (2012-09-21 14:43:22) 转载▼ 标签:  session   cookie   作用   区别   工作原理 分类...
  • Cookie工作原理 1、创建Cookie 当用户第一次浏览某个使用Cookie网站时,该网站服务器就进行如下工作: ①该用户生成一个唯一识别码(Cookie id),创建一个Cookie对象; ②默认情况下它是一个会话级别...
  • 1、cookie的作用: 我们在浏览器中,经常涉及到数据交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息呢,答案就是今天主角cookie了,...
  • 作用: 服务器可以利用Cookies或Session包含信息任意du性来筛选并经常性维护这些信息,以判断zhi在HTTP传输中状态。它们dao最典型应用是判定注册...总而言之,cookiessession就是能够记录顾客状态技术,尽管
  • Cookie概念 在浏览某些网站时,这些网站会把一些数据存在客户端,用于使用网站等跟踪用户,实现用户自定义功能。 是否设置过期时间 如果不设置过期时间,则表示这个 ...存储在硬盘上Cookie可以在不同浏览器进程间共享
  • Cookie概念 在浏览某些 网站 时,这些网站会把 一些数据存在 客户端 , 用于使用网站 等跟踪用户,实现用户自定义 功能. 是否设置过期时间: 如果不设置过期时间,则表示这个... 这个生命期为浏览会话期coo...
  • Session用于保存每个用户专用信息. 每个客户端用户访问时,服务器都为每个用户分配一个唯一会话ID(Session ID) . 她生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session中信息保存在Web...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,267
精华内容 906
关键字:

原理和作用的区别