因为可能要用到cookie,所以学了一下,但又发现不用了,为了以后不忘,写下此篇笔记。
一、cookie简介 浏览器与WEB服务器之间是使用HTTP协议进行通信的;而HTTP协议是无状态协议。也就是说,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接。因此当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待,这样的不好之处可想而知。为了弥补这个缺陷,Netscape开发出了cookie这个有效的工具来保存某个用户的识别信息, 它是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段。 它是服务器发送给浏览器的体积很小的纯文本信息。 定义:cookie是Web浏览器存储的少量命名数据,它与某个特定的网页和网站关联在一起。cookie实际上和某一网站和网页关联的,保存用户一定信息的文本文件。
二、cookie的属性 除名字与值外,每个cookie有四个可选属性:
1.expires:指定cookie的生存期。默认情况下cookie是暂时的,浏览器关闭就失效。
2.path:它指定了与cookie关联在一起的网页。默认是在和当前网页同一目录的网页中有效。 如果把path设置为"/",那么它对该网站的所有网页都可见了。
3.domain:设定cookie有效的域名, 如果把path设置为"/",把domain设为".sohu.com",那么 A.sohu.com和B.sohu.com 的所有网页都能够访问此cookie。
4.secure:布尔值,它指定了网络上如何传输cookie。默认情况下,cookie是不安全的, 可以通过一个不安全的,普通的HTTP协议传输;若设置cookie为安全的,那么它将 只在浏览器和服务器通过HTTPS或其它的安全协议连接在一起时才被传输。
三、cookie的操作 cookie可以用javascipt来操作,也可以用JSP来操作。 下面给大家我写的几个例子,相信大家一看就明白了: 1.javascript 操作:
<script language="javascript"> //设置cookie,cookie有效期时间未GMT时间(距1970年1月1日临时的毫秒) //例如可以设置setCookie("password","12345",(3600000*24*180)),180有效 function setCookie (name, value, expires) { var expdate = new Date(); expdate.setTime(expdate.getTime() + expires); document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString() + "; path=/"; } //根据cookie名,取得cookie值 function getCookie(name) { var search; search = name + "=" offset = document.cookie.indexOf(search) if (offset != -1) { offset += search.length ; end = document.cookie.indexOf(";", offset) ; if (end == -1) end = document.cookie.length; return unescape(document.cookie.substring(offset, end)); } else return ""; } //删除某一cookie function deleteCookie(name) { var expdate = new Date(); expdate.setTime(expdate.getTime() - (3600 *24* 1000 * 1)); setCookie(name, "", expdate); } //检查是否存在此cookie function checkCookie(cookieName,cookieValue){ if (getCookie(cookieName)==cookieValue){ return true; }else{ return false; } } </script> |
2.jsp 操作: java中有个Cookie类:javax.servlet.http.Cookie
|
JSP中:(以下内容来源于网络)
JSP是使用如下的语法格式来创建cookie的: Cookie cookie_name =new Cookie("Parameter","Value"); 例如:Cookie newCookie =new Cookie("username","waynezheng"); response.addCookie(newCookie); 解释:JSP是调用Cookie对象相应的构造函数Cookie(name,value)用合适的名字和值来创建Cookie,然后 Cookie可以通过HttpServletResponse的addCookie方法加入到Set-Cookie应答头,本例中Cookie对象有两个字符串参数:username,waynezheng。注意,名字和值都不能包含空白字符以及下列字符: @ : ;? , " / [ ] ( ) =
处理Cookie的属性 看到这里,有的朋友又要问了:我光知道如何创建Cookie有什么用呀?是呀,光知道如何创建Cookie而不知道怎么使用是不够的。在JSP中,程序是通过cookie.setXXX设置各种属性,用cookie.getXXX读出cookie的属性,现把Cookie的主要属性,及其方法列于下,供大家参考: 读取客户端的Cookie
类型 | 方法名 | 方法解释 |
String | getComment() | 返回cookie中注释,如果没有注释的话将返回空值. |
String | getDomain() | 返回cookie中Cookie适用的域名. 使用getDomain() 方法可以指示浏览器把Cookie返回给同 一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始(例如.yesky.com) |
int | getMaxAge() | 返回Cookie过期之前的最大时间,以秒计算。 |
String | getName() | 返回Cookie的名字。名字和值是我们始终关心的两个部分,笔者会在后面详细介绍 getName/setName。 |
String | getPath() | 返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。 |
boolean | getSecure() | 如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。 |
String | getValue() | 返回Cookie的值。笔者也将在后面详细介绍getValue/setValue。 |
int | getVersion() | 返回Cookie所遵从的协议版本。 |
void | setComment(String purpose) | 设置cookie中注释。 |
void | setDomain(String pattern) | 设置cookie中Cookie适用的域名 |
void | setMaxAge(int expiry) | 以秒计算,设置Cookie过期时间。 |
void | setPath(String uri) | 指定Cookie适用的路径。 |
void | setSecure(boolean flag) | 指出浏览器使用的安全协议,例如HTTPS或SSL。 |
void | setValue(String newValue) | cookie创建后设置一个新的值。 |
void | setVersion(int v) | 设置Cookie所遵从的协议版本。 |
在Cookie发送到客户端前,先要创建一个Cookie,然后用addCookie方法发送一个HTTP Header。 JSP将调用request.getCookies()从客户端读入Cookie,getCookies()方法返回一个HTTP请求头中 的内容对应的Cookie对象数组。你只需要用循环访问该数组的各个元素,调用getName方法检查各 个Cookie的名字,至找到目标Cookie,然后对该Cookie调用getValue方法取得与指定名字关联的值 。
例如
<% String userName=request.getParameter("username");//从提交的HTML表单中获取,用户名 Cookie theUsername=new Cookie("username",userName);//以"username",userName值/对创建一个Cookie response.addCookie(theUsername); %> .............. <% Cookie myCookie[]=request.getCookies();//创建一个Cookie对象数组 for(int n=0;n=cookie.length-1;i++);//设立一个循环,来访问Cookie对象数组的每一个元素 Cookie newCookie= myCookie[n]; if(newCookie.getName().equals("username")); //判断元素的值是否为username中的值 {%> 你好,<%=newCookie.getValue()%>!//如果找到后,向他问好 <%} %> 设置Cookie的存在时间,及删除Cookie 在JSP中,使用setMaxAge(int expiry)方法来设置Cookie的存在时间, 参数expiry应是一个整数。正值表示cookie将在这么多秒以后失效。 注意这个值是cookie将要存在的最大时间, 而不是cookie现在的存在时间。 负值表示当浏览器关闭时,Cookie将会被删除。零值则是要删除该Cookie。 如: <% Cookie deleteNewCookie=new Cookie("newcookie",null); deleteNewCookie.setMaxAge(0); deleteNewCookie.setPath("/"); response.addCookie(deleteNewCookie); %> |
jsp设置页面过期
服务端方法: <% response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", -10); %> 在登陆页面和登陆后页面均加入这段代码即可 注意,一定要在登陆页面(或类似功能的页面使session无效)
客户端方法:
meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的<head>与</head>中,meta 标签的用处很多。meta 的属性有两种:name和http-equiv。name属性主要用于描述网页,对应于content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。这其中最重要的是description(站点在搜索引擎上的描述)和keywords(分类关键词),所以应该给每页加一个meta值。比较常用的有以下几个: name 属性 1、<meta name="Generator" contect="">用以说明生成工具(如Microsoft FrontPage 4.0)等; 2、<meta name="KEYWords" contect="">向搜索引擎说明你的网页的关键词; 3、<meta name="DEscription" contect="">告诉搜索引擎你的站点的主要内容; 4、<meta name="Author" contect="你的姓名">告诉搜索引擎你的站点的制作的作者; 5、<meta name="Robots" contect= "all|none|index|noindex|follow|nofollow">
其中的属性说明如下: 设定为all:文件将被检索,且页面上的链接可以被查询; 设定为none:文件将不被检索,且页面上的链接不可以被查询; 设定为index:文件将被检索; 设定为follow:页面上的链接可以被查询; 设定为noindex:文件将不被检索,但页面上的链接可以被查询; 设定为nofollow:文件将不被检索,页面上的链接可以被查询。
http-equiv属性 1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80"> 和 <meta http-equiv="Content-Language" contect="zh-CN">用以说明主页制作所使用的文字以及语言;又如英文是ISO-8859-1字符集,还有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集; 2、<meta http-equiv="Refresh" contect="n;url=http://yourlink">定时让网页在指定的时间n内,跳转到页面http;//yourlink; 3、<meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT">可以用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。需要注意的是必须使用GMT时间格式; 4、<meta http-equiv="Pragma" contect="no-cache">是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出; 5、<meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00 GMT">cookie设定,如果网页过期,存盘的cookie将被删除。需要注意的也是必须使用GMT时间格式; 6、<meta http-equiv="Pics-label" contect="">网页等级评定,在IE的internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过meta属性来设置的; 7、<meta http-equiv="windows-Target" contect="_top">强制页面在当前窗口中以独立页面显示,可以防止自己的网页被别人当作一个frame页调用; 8、<meta http-equiv="Page-Enter" contect="revealTrans(duration=10,transtion= 50)">和<meta http-equiv="Page-Exit" contect="revealTrans(duration=20,transtion =6)">设定进入和离开页面时的特殊效果,这个功能即FrontPage中的“格式/网页过渡”,不过所加的页面不能够是一个frame页面。
Cookie 操作
Cookie是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它记录了你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。你可以在IE的“工具/Internet选项”的“常规”选项卡中,选择“设置/查看文件”,查看所有保存到你电脑里的Cookie。这些文件通常是以user@domain格式命名的,user是你的本地用户名,domain是所访问的网站的域名。如果你使用NetsCape浏览器,则存放在“C:/PROGRAMFILES/NETSCAPE/USERS/”里面,与IE不同的是,NETSCAPE是使用一个Cookie 文件记录所有网站的Cookies。
当在浏览器地址栏中键入了一个Web站点的URL,浏览器会向该Web站点发送一个读取网页的请求,并将结果在显示器上显示。这时该网页在你的电脑上寻找Amazon网站设置的Cookie文件,如果找到,浏览器会把Cookie文件中的数据连同前面输入的URL一同发送到Amazon服务器。服务器收到Cookie数据,就会在他的数据库中检索你的ID,你的购物记录、个人喜好等信息,并记录下新的内容,增加到数据库和Cookie文件中去。如果没有检测到Cookie或者你的Cookie信息与数据库中的信息不符合,则说明你是第一次浏览该网站,服务器的CGI程序将为你创建新的ID信息,并保存到数据库中。 Cookie是利用了网页代码中的HTTP头信息进行传递的,浏览器的每一次网页请求,都可以伴随Cookie传递,例如,浏览器的打开或刷新网页操作。服务器将Cookie添加到网页的HTTP头信息中,伴随网页数据传回到你的浏览器,浏览器会根据你电脑中的Cookie设置选择是否保存这些数据。如果浏览器不允许Cookie保存,则关掉浏览器后,这些数据就消失。Cookie在电脑上保存的时间是不一样的,这些都是由服务器的设置不同决定得。Cookie有一个Expires(有效期)属性,这个属性决定了Cookie的保存时间,服务器可以通过设定Expires字段的数值,来改变Cookie的保存时间。如果不设置该属性,那么Cookie只在浏览网页期间有效,关闭浏览器,这些Cookie自动消失,绝大多数网站属于这种情况。通常情况下,Cookie包含Server、Expires、Name、value这几个字段,其中对服务器有用的只是Name和value字段,Expires等字段的内容仅仅是为了告诉浏览器如何处理这些Cookies。
1.设置Cookie
- Cookie cookie = new Cookie("key", "value");
- cookie.setMaxAge(60);
设置60秒生存期,如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效。
- cookie.setPath("/test/test2");
设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分)
- response.addCookie(cookie);
2.读取Cookie
该方法可以读取当前路径以及“直接父路径”的所有Cookie对象,如果没有任何Cookie的话,则返回null
- Cookie[] cookies = request.getCookies();
3.删除Cookie
- Cookie cookie = new Cookie("key", null);
- cookie.setMaxAge(0);
设置为0为立即删除该Cookie
- cookie.setPath("/test/test2");
删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie
- response.addCookie(cookie);
4.注意:假设路径结构如下
test/test2/test345/test555/test666
a.相同键名的Cookie(值可以相同或不同)可以存在于不同的路径下。
b. 删除时,如果当前路径下没有键为"key"的Cookie,则查询全部父路径,检索到就执行删除操作(每次只能删除一个与自己最近的父路径Cookie)
FF.必须指定与设定cookie时使用的相同路径来删除改cookie,而且cookie的键名不论大写、小写或大小混合都要指定路径。
IE.键名小写时,如果当前路径为/test/test2,如果找不到再向上查询/test、/test555、/test345,如果还找不到就查询/ 。(/test555/test666不查询)
键名大小写混合或大写时,不指定路径则默认删除当前路径,并且不向上查询。
c.读取Cookie时只能读取直接父路径的Cookie。
如果当前路径为/test/test2,要读取的键为"key"。当前路径读取后,还要读取/test,/test读取后,还要读取/
d.在做Java的web项目时,由于一般的Web服务器(如Tomcat或Jetty)都用Context来管理不同的Web Application,这样对于每个Context有不同的Path,
在一个Server中有多个Web Application时要特别小心,不要设置Path为/的Cookie,容易误操作。(当然前提是域名相同)