首先要了解cookie必须得先了解http协议,,Cookie是http协议指定的,先由服务器保存cookie到浏览器,在下次浏览器请求服务器时把上次请求得到的cookie归还给服务器,cookie以键值对的形式保存在本地的缓存中.

  • HTTP协议规定:
    1. 1个cookie最大4kb
    2. 一个服务器最多向一个浏览器保存20个cookie
    3. 一个浏览器最多保存300个cookie

注意,不同浏览器还是略有差异,不是所有浏览器都老老实实的遵守这个规定.

  • cookie的用途举例:

    • 服务器使用cookie来跟踪客户端状态
    • 保存购物车
    • 显示上一次的登录名
  • Cookie的保存与获取:

我们在a.jsp中保存一个coookie,然后在b.jsp中获取到这个cookie,并遍历出来(因为比较简单,这里只提供代码部分):

//a.jsp的body部分
<%
Cookie cookie1=new Cookie("name","wang");
response.addCookie(cookie1);
Cookie cookie2=new Cookie("password","");
response.addCookie(cookie2); %> //b.jsp的body部分
<%
Cookie[] cookie1=request.getCookies();
for(Cookie c:cookie1){
out.print(c.getName()+":"+c.getValue()+"<br>"); } %>
  • Cookie的存活时间(setMaxAge()方法):

  当服务器创建Cookie对象后,可以调用setMaxAge()方法设置Cookie的最大生命。

    • maxAge > 0:表示Cookie在客户端硬盘上保存的最大时间,单位为秒,如cookie.setMaxAge(60)表示该cookie对象的存活时间为60秒
    • maxAge < 0:表示Cookie不会被浏览器保存到硬盘上,而只在浏览器内存中存活,一旦客户端关闭浏览器在,那么Cookie就消失;
    • maxAge == 0:表示删除Cookie,例如客户端硬盘已经存在名为abc的Cookie,如果服务器再向客户端发送名为abc,并且maxAge为0的Cookie,那么表示删除客户端上的名为abc的Cookie。
  • Cookie的路径(path):

设置cookie的路径需要用到cookie.setPath(String path)方法.例如:cookie.setPath("/cookie1/a");

如果没有设置cookie的路径,那么cookie的路径默认为是当前资源所在的路径,例如:

    • 访问http://localhost:8080/MyCookieDemo/cookie1/AServlet时保存了一个cookie,那么它的默认路径就是/MyCookieDemo/cookie1
    • 访问http://localhost:8080/MyCookieDemo/cookie1/demo1/BServlet时保存了一个cookie,那么它的默认路径就是/MyCookieDemo/cookie1/demo1

了解完了cookie的path,那么问题来了,它的用处是什么呢?这玩意有毛用?

    假设现在有WEB应用A,向客户端发送了10个Cookie,这就说明客户端无论访问应用A的哪个Servlet都会把这10个Cookie包含在请求中!这是不科学的,因为也许只有AServlet需要读取请求中的Cookie,而其他Servlet根本就不会获取请求中的Cookie。这说明客户端浏览器有时发送这些Cookie是多余的,这时候就可以通过设置Cookie的path来指定浏览器在访问什么样的路径时,包含什么样的Cookie。

    请求路径如果包含了Cookie路径,那么会在请求中会包含这个Cookie,否则请求中不会包含这个Cookie。如果某cookie的路径是/myCookieDemo/cookie1;当我们访问http://localhost:8080/myCookieDemo/index.jsp时,请求头中就不会携带这个cookie,而如果访问的是http://localhost:8080/myCookieDemo/cookie1/index.jsp时,请求头中就会包含这个cookie,这个页面也就能获取到此cookie中保存的数据.

  • Cookie保存中文

    Cookie的name和value都是不能保存中文的,但可以先把中文转换成URL编码,然后在保存到Cookie的name和value中。下面是代码Demo:

String name = "姓名";
String value = "张三";
name = URLEncoder.encode(name, "utf-8");
value = URLEncoder.encode(value, "utf-8"); Cookie c = new Cookie(name, value);
response.addCookie(c); //在获取Cookie时,再使用URL解码即可。
Cookie[] cs = request.getCookies();
if(cs != null) {
for(Cookie c : cs) {
String name = URLDecoder.decode(c.getName(), "utf-8");
String value = URLDecoder.decode(c.getValue(), "utf-8");
System.out.println(name + "=" + value);
}
}

重温Servlet学习笔记--Cookie对象的更多相关文章

  1. 重温Servlet学习笔记--session对象

    session的类型是属于HttpSession,HttpSession是由javaWeb提供的,用来会话跟踪的类.session是服务器端对象,保存在服务器端. HttpSession是servle ...

  2. 重温Servlet学习笔记--request对象

    request和response是一对搭档,一个负责请求一个负责响应,都是Servlet.service()方法的参数,response的知识点前面梳理过了,这里只说一下request,在客户端发出每 ...

  3. 重温Servlet学习笔记--response对象

    在用户浏览网页时,服务器对于客户端浏览器做出的响应被封装成一个HttpServletResponse对象,要对浏览器操作只需要操作这个response对象即可.response的功能分类及介绍: 响应 ...

  4. 重温Servlet学习笔记--servletContext对象

    一个项目中只有一个ServletContext对象,我们可以在多个servlet中获取这个唯一的对象,使用它可以给多个servlet传递数据,我们通常成servletContext为上下文对象.这个对 ...

  5. 重温Servlet学习笔记--编码问题

    在说编码问题之前,首先先了解一下常见的字符编码: ISO-8859-1:  拉丁编码,不支持中文 gbk,gb2312,gb18030:系统默认编码,是中国的国标码 utf-8: 支持几乎所有语言的编 ...

  6. # jsp及servlet学习笔记

    目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...

  7. Servlet学习笔记(四)

    目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...

  8. Servlet学习笔记(三)

    目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...

  9. Servlet学习笔记(二)

    目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...

随机推荐

  1. 解决Unity5+Vuforia+Network本地联机发布到Android上白屏的问题

    Unity5+Vuforia+Network本地联机,在Android下点击联机,然后识别模型就出现白屏,点击屏幕上相应位置的按钮(已白屏,但点击该看不见的按钮)还是能起作用,如跳转到其他场景正常. ...

  2. Python join()函数

    今天写python 100例时,有个题目是大致是这样的:已知输入形式是1+3+2+1,要求输出形式为1+1+2+3 一开始思路是将输入的字符串用split()函数划分成数组,在对数组进行排序,再用fo ...

  3. Java演算法之快速排序法

    1 * 快速排序法(Quick Sort),遞迴版本. 2 * 3 * @param array 傳入要排序的陣列 4 * @param start 傳入要排序的開始位置 5 * @param end ...

  4. Tomcat启动失败Unrecognized Windows Sockets error: 0: JVM_Bind

    问题:Tomcat一直无法运行,或者是运行了报上面图片的哪些错误. 解决:关闭myeclipse,打开任务管理器(Ctrl+Alt+Delete)关闭javaw.exe这个进程,另外说一下,Tomca ...

  5. SQL Server数据库备份的镜像

    SQL Server数据库备份的镜像 一个完整备份可以分开镜像 USE master GO BACKUP DATABASE [testdatabase] TO DISK = N'C:\testdata ...

  6. Centos7下安装mono3.10.0

    mono 3.10.0 正式发布:性能进一步改进,以前已经写过一篇  Centos 7.0 安装Mono 3.4 和Jexus 5.6.下面我们在CentOS 7上通过源码安装Mono 3.10, 需 ...

  7. Mycat 月分片方法

    概述 本篇文章主要介绍Mycat以月进行分片的方法,包括配置方法.注意事项等. mycat版本:1.4 数据节点:dn1,dn2,dn3 架构:主从 配置  创建测试表 CREATE TABLE `t ...

  8. 如果调用ASP.NET Web API不能发送PUT/DELETE请求怎么办?

    理想的RESTful Web API采用面向资源的架构,并使用请求的HTTP方法表示针对目标资源的操作类型.但是理想和现实是有距离的,虽然HTTP协议提供了一系列原生的HTTP方法,但是在具体的网络环 ...

  9. Golang与C#之switch区别

    Golang与C#之switch区别 Go是Google开发的一种编译型,可并行化,并具有垃圾回收功能的编程语言. C#是微软公司发布的一种面向对象的.运行于.NET Framework之上的高级程序 ...

  10. storm 集群配置

    配置storm集群的过程中出现写问题,记录下来 1.storm是通过zookeeper管理的,先要安装zookeeper,从zk官网上下来,我这里下下来的的3.4.9,下载后移动到/usr/local ...