如何操作Cookie

因为可能要用到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

 


    //读取cookie的通用类,以Cookie[] 做参数传个构造函数;
    package com.test;
    import javax.servlet.http.*;
 /**
 * @author sheng_li
 *
 */
 public class ComCookie {
 private Cookie[] cookies;
 private Cookie cookie;
 public ComCookie(Cookie[] cs){
  cookies = cs;  
 }
 /**
  * 通过cookieName,取得cookieValue,如果没有此cookie则返回默认值
  * @param cookieName
  * @param defaultValue
  * @return
  */
 public String getCookieValue(String cookieName,String defaultValue) {
  for(int i=0; i< cookies.length; i++) {
    Cookie cookie = cookies[i];
    if (cookieName.equals(cookie.getName()))
   return(cookie.getValue());
  }
  return(defaultValue);
 }
 /**
  * 类方法,通过cookieName,取得cookieValue
  * @param cookies
  * @param cookieName
  * @param defaultValue
  * @return
  */
 public static String getCookieValue(Cookie[] cookies,
       String cookieName,
       String defaultValue) {
  for(int i=0; i < cookies.length; i++) {
    Cookie cookie = cookies[i];
    if (cookieName.equals(cookie.getName()))
   return(cookie.getValue());
  }
  return(defaultValue);
 }
 }

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

类型方法名方法解释
StringgetComment()返回cookie中注释,如果没有注释的话将返回空值.
StringgetDomain()返回cookie中Cookie适用的域名. 使用getDomain() 方法可以指示浏览器把Cookie返回给同 一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始(例如.yesky.com)
intgetMaxAge()返回Cookie过期之前的最大时间,以秒计算。
StringgetName()返回Cookie的名字。名字和值是我们始终关心的两个部分,笔者会在后面详细介绍 getName/setName。
StringgetPath()返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。
booleangetSecure()如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。
StringgetValue()返回Cookie的值。笔者也将在后面详细介绍getValue/setValue。
intgetVersion()返回Cookie所遵从的协议版本。
voidsetComment(String purpose)设置cookie中注释。
voidsetDomain(String pattern)设置cookie中Cookie适用的域名
voidsetMaxAge(int expiry)以秒计算,设置Cookie过期时间。
voidsetPath(String uri)指定Cookie适用的路径。
voidsetSecure(boolean flag)指出浏览器使用的安全协议,例如HTTPS或SSL。
voidsetValue(String newValue)cookie创建后设置一个新的值。
voidsetVersion(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

 
  1.   Cookie cookie = new Cookie("key", "value");   
  2.  
  3.   cookie.setMaxAge(60);   

  设置60秒生存期,如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效。

 
  1. cookie.setPath("/test/test2");  

  设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分)

  1. response.addCookie(cookie);  

  2.读取Cookie

  该方法可以读取当前路径以及“直接父路径”的所有Cookie对象,如果没有任何Cookie的话,则返回null

  1. Cookie[] cookies = request.getCookies();  

  3.删除Cookie

 
  1. Cookie cookie = new Cookie("key", null);   
  2.  
  3. cookie.setMaxAge(0);   

  设置为0为立即删除该Cookie

 
  1. cookie.setPath("/test/test2");  

  删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie

  1. 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,容易误操作。(当然前提是域名相同)

转载于:https://www.cnblogs.com/lcuzhanglei/archive/2012/06/06/2538258.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值