Servlet学习笔记(四)----- Cookie

该篇文章是我在学习Cookie时的学习笔记。在学习的学习的过程我借鉴了很多篇很好的文章。本着尊重他人劳动成果的原则链接在文末都贴出来了。因为我只是记录了我个人觉得有用的部分,因此有兴趣的朋友可以去阅读完整版。

1.了解什么是Cookie以及它的主要作用

1.1、cookie的作用:

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


1.2、机制的区别:

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


1.3、cookie的分类:

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

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



2.如何添加一个Cookie?在Servlet中。 

主要思路:创建一个Cookie对象,输入键值对。并且可以设置最长有效时间MaxAge(以秒为单位),在用函数

response.addCookie()添加即可。

但是有一个问题:就是该段程序在运行后,在测试Cookie中我无法找到我添加的这个cookie。现在还在思考为什么。


3.如何获取全部的Cookie?

主要思路:request.getCookies()函数来获得所有的Cookie。因为Cookie是以键值对的方式存储的,所有提取name和value即可。


输出结果:

第一个是用Myeclipse打开的。

第二个是用列表浏览器打开的。

注:123是我用来检测的,可自行忽略。



4.javascript操作cookie函数两种简单的写法

(这个地方我是转载,个人觉得他介绍的很详细,但是有一点点啰嗦。恩,一点点。。。)

整理了两种简单的javascript操作cookie写法,均有三个功能:设置cookie、查询cookie、删除cookie。第一种简单易懂,第二种封装使用方便。原生js设置cookie。

首先设置cookie

每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie: 
document.cookie="userId=125"; 
如果要一次存储多个名/值对,可以使用分号加空格(; )隔开,例如: 
document.cookie="userId=828; userName=UFO"; 
在cookie的名或值中不能使用分号(;)、逗号(,)、等号(=)以及空格。在cookie的名中做 
到这点很容易,但要保存的值是不确定的。如何来存储这些值呢?方法是用escape()函数进行编 
码,它能将一些特殊符号使用十六进制表示,例如空格将会编码为“20%”,从而可以存储于 
cookie值中,而且使用此种方案还可以避免中文乱码的出现。例如: 
document.cookie="str="+escape("I love UFO"); 
相当于: 
document.cookie="str=I%20love%20UFO"; 
当使用escape()编码后,在取出值以后需要使用unescape()进行解码才能得到原来的cookie值, 
尽管document.cookie看上去就像一个属性,可以赋不同的值。但它和一般的属性不一样,改变 
它的赋值并不意味着丢失原来的值,例如连续执行下面两条语句: 
document.cookie="userId=125"; 
document.cookie="userName=UFO"; 

这时浏览器将维护两个cookie,分别是userId和userName,因此给document.cookie赋值更像执 
行类似这样的语句: 
document.addCookie("userId=125"); 
document.addCookie("userName=UFO"); 

事实上,浏览器就是按照这样的方式来设置cookie的,如果要改变一个cookie的值,只需重新赋 
值,例如: 
document.cookie="userId=451"; 
这样就将名为userId的cookie值设置为了451。 
获取cookie的值

下面介绍几个cookies操作函数

简单版:

 代码如下复制代码

function setCookie(name, value, iDay) {
    var oDate = new Date();
    oDate.setDate(oDate.getDate() + iDay);
    document.cookie = name+'='+value+';expires='+oDate+';path=/';
}
function getCookie(name) {
    var arr = document.cookie.split('; ');
    var i = 0;
    for(i=0; i<arr.length; i++) {
        var arr2 = arr[i].split('=');
        if(arr2[0] == name) {return arr2[1];}
    }
    return '';
}
function removeCookie(name) {
    setCookie(name,'',-1);
}

封装版:

 代码如下复制代码

var cookie=new function(){
    this.set=function(name,value,hours){
        var life=new Date().getTime();
        life+=hours*1000*60*60;
        var cookieStr=name+"="+escape(value)+";expires="+new Date(life).toGMTString()+";path=/";
        document.cookie=cookieStr;
    };
    this.get=function(name){
        var cookies = document.cookie.split("; ");
  var i = 0;
  for(i=0; i<cookies.length; i++) {
   var cookie2=cookies[i].split("=");
   if(cookie2[0]==name) {return unescape(cookie2[1]);}
  }
        return '';
    };
    this.remove=function(name){
        var cookieStr=name+"=''"+escape('null')+";expires="+new Date().toGMTString();
        document.cookie=cookieStr;
    };

}


参考:https://yq.aliyun.com/ziliao/59356

参考:https://blog.csdn.net/u014753892/article/details/52821268


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值