栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

通过实例了解cookie机制特性及使用方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过实例了解cookie机制特性及使用方法

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是cookie与Session。cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

1.1 cookie机制:

一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用cookie来跟踪会话。

cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持cookie。由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是cookie的工作原理。cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器。服务器检查该cookie,以此来辨认用户状态。服务器还可以根据需要修改cookie的内容。
备注:cookie功能需要浏览器的支持。如果浏览器不支持cookie(如大部分手机中的浏览器)或者把cookie禁用了,cookie功能就会失效。不同的浏览器采用不同的方式保存cookie。IE浏览器会在“C:documents and Settings你的用户名cookies”文件夹下以文本文件形式保存,一个文本文件保存一个cookie。

1.2 cookie的特性:

1.2.1) cookie具有不可跨域名性:

根据cookie规范,浏览器访问Google只会携带Google的cookie,而不会携带Baidu的cookie。Google也只能操作Google的cookie,而不能操作Baidu的cookie。这是由cookie的隐私安全机制决定的。
隐私安全机制能够禁止网站非法获取其他网站的cookie。
注意:

a.用户登录网站www.google.com(一级域名)之后会发现访问images.google.com(二级域名)时登录信息仍然有效,而普通的cookie是做不到的。这是因为Google做了特殊处理。

b.如果想所有helloweenvsfei.com名下的二级域名都可以使用该cookie,需要设置cookie的domain参数,例如:

cookie cookie = new cookie("username","ceshi"); // 新建cookie
cookie.setDomain(".google.com"); // 设置域名
cookie.setPath("/"); // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE); // 设置有效期
response.addcookie(cookie); // 输出到客户端

c.开发人员可以修改本机C:WINDOWSsystem32driversetc下的hosts文件来配置多个临时域名,然后使用operatecookie.jsp程序来设置跨域名cookie验证domain属性domain参数必须以点(".")开始。另外,name相同但domain不同的两个cookie是两个不同的cookie。如果想要两个域名完全不同的网站共有cookie,可以生成两个cookie,domain属性分别为两个域名,输出到客户端。

1.2.2) 保存中文是需要转码为Unicode编码:

中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。

备注:cookie中保存中文只能编码。一般使用UTF-8编码即可。不推荐使用GBK等中文编码,因为浏览器不一定支持,而且Javascript也不支持GBK编码。

1.2.3) 保存二进制图片需要使用base64编码:cookie不仅可以使用ASCII字符与Unicode字符,还可以使用二进制数据。例如在cookie中使用数字证书,提供安全度。使用二进制数据时也需要进行编码。

备注:本程序仅用于展示cookie中可以存储二进制内容,并不实用。由于浏览器每次请求服务器都会携带cookie,因此cookie内容不宜过多,否则影响速度。cookie的内容应该少而精。

1.2.4)cookie有效期时间单位为秒:cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。

a.cookie默认的maxAge值为–1 如果maxAge为0,则表示删除该cookie。cookie机制没有提供删除cookie的方法,因此通过设置该cookie即时失效实现删除cookie的效果。失效的cookie会被浏览器从cookie文件或者内存中删除,

b.如果maxAge属性为正数 则表示该cookie会在maxAge秒之后自动失效,浏览器会将maxAge为正数的cookie持久化,即写到对应的cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之
前,登录网站时该cookie仍然有效。

c.如果maxAge为负数 则表示该cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该cookie即失效。maxAge为负数的cookie,为临时性cookie,不会被持久化,不会被写到cookie文
件中。cookie信息保存在浏览器内存中,因此关闭浏览器该cookie就消失了。

b.设置cookie信息将永远有效

cookie cookie = new cookie("username","ceshi"); // 新建cookie
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为MAX_VALUE
response.addcookie(cookie); // 输出到客户端

d.如何实现对cookie的修改:

response对象提供的cookie操作方法只有一个添加操作add(cookie cookie)。要想修改cookie只能使用一个同名的cookie来覆盖原来的cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。
备注:

a.从客户端读取cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断cookie是否过期。

b.修改、删除cookie时,新建的cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原cookie完全一样。否则,浏览器将视为两个不同的cookie不予覆盖,导致修改、
删除失败。

1.2.5)允许进行cookie访问的路径设置:

domain属性决定运行访问cookie的域名,而path属性决定允许访问cookie的路径(ContextPath)。例如,如果只允许/session/下的程序使用cookie,可以这么写:

cookie cookie = new cookie("username","ceshi"); // 新建cookie
cookie.setPath("/session/");      // 设置路径
response.addcookie(cookie);     // 输出到客户端

备注:

a.设置为“/”时允许所有路径使用cookie。path属性需要使用符号“/”结尾。name相同但domain相同的两个cookie也是两个不同的cookie。

b.页面只能获取它属于的Path的cookie。例如/session/test/a.jsp不能获取到路径为/session/abc/的cookie。使用时一定要注意。

1.2.6)设置cookie的安全属性:

HTTP协议不仅是无状态的,而且是不安全的。使用HTTP协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议传输很机密的内容是一种隐患。如果不希望cookie在HTTP等非安全协议中传输,可以设置cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类cookie。下面的代码设置secure属性为true:

cookie cookie = new cookie("username", "ceshi"); // 新建cookie
cookie.setSecure(true);      // 设置安全属性
response.addcookie(cookie);    // 输出到客户端

备注:secure属性并不能对cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对cookie内容加密、解密,以防泄密。

1.2.7)不支持跨域进行cookie窥探:

客户端对cookie的设置: document.cookie = "CITY=" +cityCode+";domain=" + cookieDomain + ";path=/";

备注:W3C组织早就意识到Javascript对cookie的读写所带来的安全隐患并加以防备了,W3C标准的浏览器会阻止Javascript读写任何不属于自己网站的cookie。换句话说,A网站的Javascript程序
读写B网站的cookie不会有任何结果。

1.2.8)cookie的键值对属性:

cookie对象使用key-value属性对的形式保存用户状态,一个cookie对象保存一个属性对,一个request或者response同时使用多个cookie。因为cookie类位于包javax.servlet.http.*下面,所以JSP中不需要import该类。

1.3 cookie信息的获取和赋值代码:


  javax.servlet
  servlet-api


import javax.servlet.http.cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 一周 cookie的过期时间以秒为单位进行计算
private static final int WEEK = 7 * 24 * 3600;


public static String getValue(HttpServletRequest request, String cookieName){
  if (StringUtils.isEmpty(cookieName)) {
    return null;
  }
  cookie[] cookies = request.getcookies();
  if (cookies != null){
    for (int i = 0; i < cookies.length; i++) {
     if (cookieName.equalsIgnoreCase(cookies[i].getName())) {
      return cookies[i].getValue();
     }
    }
  }
  return null;
}


public static void setcookie(HttpServletResponse response,String cookieKey,String cookievalue,int maxAge){
  cookie namecookie = new cookie(cookieKey,cookievalue);
  namecookie.setMaxAge(maxAge);
  response.addcookie(namecookie);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/131418.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号