热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Cookie用法大全

cookie简介1.定义cookie是由服务器发送给客户端(浏览器)的小量信息。2.作用cookie是键值对形式存储的少量信息,那它有

COOKIE简介

1. 定义
COOKIE是由服务器发送给客户端(浏览器)的小量信息。

2. 作用
COOKIE是键值对形式存储的少量信息,那它有什么作用呢?

我们知道,平时上网时都是使用无状态的HTTP协议传输出数据,这意味着客户端与服务端在数据传送完成后就会中断连接。这时我们就需要一个一直保持会话连接的机制。在session出现前,COOKIE就完全充当了这种角色。也就是,COOKIE的小量信息能帮助我们跟踪会话。一般该信息记录用户身份。

当然COOKIE也常记录跟踪购物车的商品信息(如数量)、记录用户访问次数等。

3. 原理
客户端请求服务器时,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个COOKIE。而客户端浏览器会把COOKIE保存起来。当浏览器再请求服务器时,浏览器把请求的网址连同该COOKIE一同提交给服务器。服务器通过检查该COOKIE来获取用户状态。

4.添加COOKIE示例
获取客户端的COOKIE时,只能获取name与value属性,其它属性都不会被提交。

COOKIE c = new COOKIE("username","peter");// 新建一个COOKIE对象
c.setMaxAge(24*60*60); // 设置过期时间1天,以秒为单位
response.addCOOKIE(c); // 保存COOKIE到客户端

5.删除COOKIE示例
删除某个COOKIE时,只需要新建一个只有maxAge和value不一样的同名COOKIE,然后添加到response中覆盖原来的COOKIE

COOKIE COOKIE = new COOKIE("username","peter");// 新建COOKIE
COOKIE.setMaxAge(0); // 设置生命周期为0,表示将要删除
response.addCOOKIE(COOKIE); // 执行添加后就从response里删除了

6.修改COOKIE示例

修改某个COOKIE时,只需要新建一个只有value属性不一样的同名COOKIE,然后添加到response中覆盖原来的COOKIE

COOKIE COOKIE = new COOKIE("username","joker");// 新建COOKIE
COOKIE.setMaxAge(24*60*60); // 设置生命周期
response.addCOOKIE(COOKIE); // 执行添加后就从response里覆盖修改了

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

COOKIE类的各方法详解

COOKIE类在javax.servlet.http.COOKIE包中
这里写图片描述

对应的getter方法我就不讲了。
如果COOKIE值为Unicode字符,需要为字符编码。如果COOKIE值为二进制数据,则需要使用BASE64编码

COOKIE的setPath()和setDomain()方法
默认情况下COOKIE只能在一个应用中共享,即一个COOKIE只能由创建它的应用获得。

设置同一服务器内的COOKIE使用范围用setPath
c.setPath(“/”),使同一服务器内所有应用都可访问到该COOKIE:

COOKIE c = new COOKIE("name","peter");
c.setMaxAge(24*60*60);
c.setPath("/");//同一服务器内所有应用都可访问到该COOKIE
response.addCOOKIE(c); //保存COOKIE到客户端

1.如果同一服务器内有两个应用agx1.0和agx2.0
当我们在agx1.0里有c.setPath(“/agx2.0/”);时,该COOKIE就只能在agx2.0下面能获取到,就连创建该COOKIE的agx1.0也获取不到。

2.如果在agx1.0里有c.setPath(“/agx2.0/abc/”);时,则只能在agx2.0/abc下面才能获得该COOKIE,即使在agx2.0下面也不能获取到。

COOKIE的跨域
1.正常情况下COOKIE不可跨域名,如域名www.google.com颁发的COOKIE不会被提交到域名www.baidu.com去。这是由COOKIE的隐私安全机制决定的。即使在同一个一级域名下的两个二级域名如www.agx.com和images.agx.com也不能交互使用COOKIE,因为二者的域名并不严格相同。如果想所有agx.com名下的二级域名都可以使用该COOKIE,则需要设置COOKIE的domain参数为”.agx.com”,例如:

COOKIE COOKIE = new COOKIE("name","peter"); // 新建COOKIE
COOKIE.setDomain(".agx.com"); // 设置域名
COOKIE.setPath("/"); // 设置路径
COOKIE.setMaxAge(Integer.MAX_VALUE); // 设置有效期为永久
response.addCOOKIE(COOKIE); // 输出到客户端

读者可以修改本机C:\WINDOWS\system32\drivers\etc下的hosts文件来配置多个临时域名,然后使用setCOOKIE.jsp程序来设置跨域名COOKIE验证domain属性。
注意:domain参数必须以点(“.”)开始。另外,name相同但domain不同的两个COOKIE是两个不同的COOKIE。如果想要两个域名完全不同的网站共有COOKIE,可以生成两个name相同的COOKIE,domain属性分别为两个域名。

2.若A服务器的域名为:adv.audiogroup.com,有应用名为:agx1.0; B服务器的域名为:agx.com,有应用名为:agx2.0。
在A服务器的agx1.0应用下设置COOKIE如下:

COOKIE COOKIE = new COOKIE("name","peter"); // 新建COOKIE
COOKIE.setDomain(".agx.com"); // 设置域名
COOKIE.setPath("/"); // 设置路径
COOKIE.setMaxAge(Integer.MAX_VALUE); // 设置有效期为永久
response.addCOOKIE(COOKIE); // 输出到客户端

这时,在B服务器下的agx2.0应用和agx1.0里都能取到上面的COOKIE。
注:输入URL访问agx2.0时,必须输入域名才能获取其它服务器共享给它的COOKIE,如:
输入http://images.agx.com:8080/agx2.0,可以获取agx1.0在客户端设置的COOKIE
输入:http://localhost:8080/agx2.0则不可以获得COOKIE。

setPath()与setDomain()的区别?
setDomain()主要用来确定两个不同名称但后缀相同的网站地址是否能使用同一个COOKIE。
例: www.agx.com和 bbs.agx.com只要有COOKIE.setDomain(“.zjut.edu.cn”);就都能使用该COOKIE

setPath()主要用来确定地址里什么后缀下能够使用这个COOKIE

归结起来就是:setDomain决定允许访问COOKIE的域名,而setPath决定允许访问COOKIE的路径(ContextPath)

获取用户请求里的COOKIE

COOKIE[] COOKIE = request.getCOOKIEs();//获取的是请求里的所有COOKIE组成的数组
for(int i=0;iif("name".equals(COOKIE[i].getName())){System.out.println(COOKIE[i].getValue());//得到peterbreak;}
}

解决COOKIE里中文乱码问题
COOKIE中要保存中文只能编码。一般使用UTF-8编码即可。不推荐使用GBK等中文编码,因为浏览器不一定支持,而且Javascript也不支持GBK编码。

COOKIE不仅可以使用ASCII字符与Unicode字符,还可以使用二进制数据。例如在COOKIE中使用数字证书,提供安全度。使用二进制数据时也需要进行编码(如用BASE64编码保存二进制图片)。由于浏览器每次请求都会带着COOKIE,因此COOKIE内容不宜过多,所以一般不会在COOKIE中存储二进制的内容

JS操作COOKIE
COOKIE是保存在客户端的,所以浏览器可以使用脚本(JS)等操作COOKIE。

<script language&#61;Javascript> //添加COOKIEfunction setCOOKIE(name,value,time){ var date&#61; new Date(); date.setDate(date.getDate()&#43;time); document.COOKIE &#61; name&#43;"&#61;"&#43;value&#43;";expires&#61;"&#43;date; } //获得COOKIEfunction getCOOKIE(name){ var arr &#61; document.COOKIE.split(";"); for(var i&#61;0; ivar arr2 &#61; arr[i].split("&#61;"); if(arr2[0] &#61;&#61; name){ return arr2[1]; } } return null; } //删除COOKIEfunction removeCOOKIE(name){ setCOOKIE(name,"",0) }
script>

W3C标准的浏览器会阻止Javascript读写任何不属于自己网站的COOKIE。即A网站的Javascript代码里获取不到B网站的COOKIE。

使用COOKIE记住密码
方案1&#xff1a;
直接把用户名与密码都保持到COOKIE中&#xff0c;下次访问时检查COOKIE中的用户名与密码&#xff0c;与数据库比较。这是一种比较危险的选择&#xff0c;一般不把密码等重要信息保存到COOKIE中。
方案2&#xff1a;
把密码加密后保存到COOKIE中&#xff0c;下次访问时解密并与数据库比较。这种方案略微安全一些。如果不希望保存密码&#xff0c;还可以把登录的时间戳保存到COOKIE与数据库中&#xff0c;到时只验证用户名与登录时间戳就可以了。
方案3&#xff1a;
实现方式是把账号按照一定的规则&#xff08;密钥&#xff09;加密后&#xff0c;连同账号一块保存到COOKIE中。下次访问时只需要判断账号的加密规则是否相同即可。
加 密&#xff1a;

String userName &#61; request.getParameter("userName");//获取用户名
Md5Hash psw &#61; new Md5Hash(userName, "peter.com", 2);//以peter.com为密钥加密//将用户名添加进COOKIE并发送给客户端
COOKIE userCOOKIE &#61; new COOKIE("userName",userName);
userCOOKIE.setMaxAge(7*24*60*60);
response.addCOOKIE(userCOOKIE);//将密钥生成的密文加进COOKIE并发送给客户端
COOKIE c &#61; new COOKIE("key",psw.toString());
c.setMaxAge(7*24*60*60);
response.addCOOKIE(c);

解密&#xff1a;

String usreName &#61; null;
String key &#61; null;
COOKIE[] COOKIE &#61; request.getCOOKIEs();
if(COOKIE !&#61;null){ for(COOKIE c:COOKIE){ // 遍历COOKIEif("userName".equals(c.getName()) userName &#61; c.getValue(); if("key".equals(c.getName()) key&#61; COOKIE.getValue(); }
}
if(userName !&#61; null && key !&#61; null){ String secrect &#61; new Md5Hash(userName, "peter.com", 2);if(key.equals(secrect )){//加密规则正确&#xff0c;说明已经登录//...//....省略后续处理}
}

由上面可知&#xff0c;如果将密码加密后存进COOKIE后&#xff0c;当我们下次访问登录页时&#xff0c;密码框里的密码将不是用户真正的密码。


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • springboot启动不了_Spring Boot + MyBatis 多模块搭建教程
    作者:枫本非凡来源:www.cnblogs.comorzlinp9717399.html一、前言1、创建父工程最近公司项目准备开始重构,框 ... [详细]
  • springboot项目引入jquery浏览器报404错误的解决办法
    本文介绍了在springboot项目中引入jquery时,可能会出现浏览器报404错误的问题,并提供了解决办法。问题可能是由于将jquery.js文件复制粘贴到错误的目录导致的,解决办法是将文件复制粘贴到正确的目录下。如果问题仍然存在,可能是其他原因导致的。 ... [详细]
author-avatar
mobiledu2502857673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有