概述:
cookie是以键值对的形式存在的,储存在客户端的内存或者硬盘中(设置cookie过期时间的时候存放在硬盘,否者存放在内存中),由服务器发送给客户端,客户端下次访问的时候服务器的时候,服务器可以通过请求协议获取上次储存的内容
优点:
- 可配置到期时间,数据可以永久保存
- 不需要服务器资源,数据保存在客户端
- 简单性,是以键值对的形式存在的
缺点
- 大小受到限制,每个浏览器对同一个域名所包含的cookie个数和不同域名的cookie个数是有限制的,不同的浏览器限制的个数不同,但是单个cookie的大小都是限制在4kb以内
- 用户可能会禁止浏览器接收cookie
- 多人共用一台计算机(例如导致用户名和密码不安全等问题)
- cookie使用明文(未加密)传递的,安全性低
- cookie会被附加在每次Http请求协议中,增加流量
cookie的常用方法
- getMaxAge()/setMaxAge()
读取/设置cookie到期时间,单位是秒,如果值是0,则表示删除对应的cookie;若值是负数,则表示该cookie仅对此次浏览会话有限(默认值是-1,关闭浏览器,cookie删除); - getName()
获取cookie的名称,不存在setName()方法 - getValue()/setValue()
读取/设置cookie关联的值(如果重新设置了某cookie的值,需要用addCookie()方法重新发送给客户端
先写一个servlet用于向客户端发送cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*键或者值含有中文的情况下使用这种,中文采用的 是unicode编码,而英文采用的是ASCII编 码,
所以当COOkie保存中文的时候需要对中文进行编码,而且从Cookie中取出内容 的时候也要进行解码 */
String value=URLEncoder.encode("中文", "utf-8");//设置编码格式
Cookie cookie=new Cookie("name",value);//创建cookie实例对象
response.addCookie(cookie);//将Cookies实例对象,添加到Response对象中
//键或者值不含有中文的情况可以使用这种方法简化一点,当然不含有中文也可以使用上面那种方法
/*Cookie cookie=new Cookie("name","xingmeng");
response.addCookie(cookie);*/
}
创建另一个Servlet用于获取服务器端向客户端发送的Cookie信息
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies=request.getCookies();//通过Request对象获取上次服务器端发送的Cookie信息
if(cookies!=null){//判断Request对象中的Cookie是否存在
for(Cookie cookie:cookies){//遍历Request对象中的所有Cookie
if(cookie.getName().equals("name")){//判断Cookie的名称是否是name
String value=URLDecoder.decode(cookie.getValue(),"utf-8");//把value解码成utf-8格式再打印
System.out.print(value);//打印在控制台
}
}
}
}