今儿个聊一聊Cookie的一些入门知识点
进入正题前,先了解一下我们常用的四大域对象
域对象:能放数据,取数据,删除数据
四大域:范围从大到小
域对象 | 域对象的作用范围 |
---|---|
ServletContext | 整个项目 |
(常用)HttpSession | 一次会话作用域有效 |
(常用)Request作用域 | 一次请求内有效 |
Page域 | 同一个页面有效 |
Cookie对象是HttpSession域对象中的一个分支
提到Cookie就离不开会话跟踪技术了
会话跟踪技术: 从第一次访问服务器开始,到关闭浏览器之间的整个过程,Session域的数据有效,每个用户有每个用户的Session
Session的ID编号会存入客户端浏览器的Cookie
换句话说,Cookie每个浏览器都会有,但是Cookie是不能跨浏览器的,也就IE浏览器里的Cookie数据火狐浏览器,Chrome浏览器肯定是获取不到的
好比你去一家A银行办卡存钱,你的账户信息B银行获取不到你的账户信息
Cookie有一些规范:
Cookie的大小上限4kb
一个浏览器最多保存300个Cookie
一个服务器最多再客户端浏览器上保存20个Cookie
补充说明:规范只作为了解,现在很多浏览器为了提高性能已经优化了这方面的一些限制了
Cookie对象的方法:
构造:
Cookie(String name,String value)
//Cookie的构造方法
//如果创建的Cookie的key已经存在,新的Cookie会覆盖旧的
//也就是说Cookie对象也是以key-value键值对的形式存储数据的
操作数据:
getValue() setValue()
//获取或者修改Cookie的值
getName()
//拿到Cookie的name
setMaxAge(int expiry)
//设置Cookie存放的时间,默认单位是秒
//expriy=0:表示Cookie立即删除
//expriy=-1:该值是默认值,Cookie存在客户端内存,当浏览器关闭时,Cookie清除
//expriy>0:即为该Cookie存放时间
//expiry=60 表示Cookie存放60秒,60秒后浏览器删除该Cookie
修改路径:
setPath()
//设置Cookie访问的路径
访问路径问题
Cookie路径: Cookie如果没有设置路径,默认路径是 “/项目名”
举个栗子: 有三个Servlet类,路径分别如下
ACookie: /test
BCookie: /test/servlet
CCookie: /test/jsp
这三个Servlet能否互相访问内容?
我们先来看看他们各自的url路径
http://locathost:8888/xx/test/AServlet http://locathost:8888/xx/test/servlet/BServlet http://locathost:8888/xx/test/jsp/CServlet
AServlet 只能访问ACookie
BServlet 访问ACookie和BCookie
CServlet 访问ACookie和CCookie
Cookie的创建与使用
步骤:
//创建Cookie,Cookie不能存放中文
Cookie c=new Cookie("age","21");
Cookie c1=new Cookie("name","zs");
//给Cookie设置声明周期, 默认单位:秒
c.setMaxAge(7*24*60*60);//7天
//保存到客户端
response.addCookie(c);
response.addCookie(c1);
编码/解码问题:
Cookie存放中文,需要将数据进行编码
方法:
URLEncoder.encode()
URLDeEncode.decode()
用法:
String str="博客";
//编码
String url=URLEncoder.encode(str,"UTF-8");
//解码
String newStr=URLDecoder.decode(urlStr,"UTF-8");
补充说明:一般实际开发很少用到Cookie中转换为中文,因为中文在开发中还是存在很多未知的错误,这是其一
执行上述的代码发现,编码的"博客"长度很长占的空间比中文大,而"博客"在UTF-8中才占6个字节