一、cookie介绍
1.简单介绍
Cookies是一个很少的信息片段,可自动地在浏览器和Web服务器间交互,因此Cookies可存储在多个页面间传递信息。Cookie是HTTP Headers的一部分,其传输由HTTP协议控制,此外,可以控制Cookies的有效时间。浏览器通常支持20多个cookie。简单地说,cookie是一种浏览器会话技术,将浏览器和服务器之间的产生数据记录下来,在登录时有效。
举个例子:淘宝(登录/不登录)--->如果不登录--->将会话数据保存在cookie(加入购物车的数据),如果登录-->服务器(session中)。
2.cookie的细节:(不适合存储私有数据)
1)只能存储String类型的数据
2)浏览器存储cookie的个数限制:300个
tomcat/webapp里面的文件都是站点,每一个站点可以存储20多个cookie,每一个cookie的大小不超过4Kb.
3)有效期的问题:
public void setMaxAge(int expiry):cookie的有效期:默认浏览器关闭时
设置cookie的最大生存时间,以秒为单位。参数为正整数:超过了当前的值,表示cookie过期了。
参数为0:清空浏览器记录;直接将cookie会话结束。
public void setPath(String uri):设置当前cookie的有效路径
如果存在项目名称: 由”/项目名称“到”/rem",如果设置了有效路径,才能使用cookie的数据。
4)cookie不能存储中文的数据。要存储中文,必须加密和解密。URLDecoder URLInCoder
二、cookie的应用场景
1)打开浏览器-->访问网站--->填写用户登录数据(会话数据)--->校验成功-->首页,显示当前用户的用户名信息-->关闭浏览器
直接打开浏览器--->访问同一个网站-->直接显示用户信息
2)访问一个商品列表-->点击某一个商品--->浏览器关闭
下一次进来-->访问商品列表-->记录之前访问过的商品数据
三、cookie的使用
1.有关cookie的一些方法
1)服务器端创建Cookie,将cookie的数据携带给浏览器。
public Cookie(String name,String value)(响应头:setCookie:key=vlaue)
2)通过浏览器端将数据存储在缓存区中,(请求头:cookie:key=value)
public void addCookie(Cookie cookie)将cookie写回浏览器,等待下次访问。
将指定的cookie添加到响应,可多次调用此方法。
3)在后台获取cookie。
public Cookie[] getCookies();//由request对象调用
4)获取cookie的名称
public String getName()
5)获取cookie的内容
public String getValue();//返回cookie的值
6)设置cookie的最大生命周期,以秒为单位。
public void setMaxAge(int expiry)
2.cookie的简单使用
1)创建cookie
2)将cookie数据由服务器创建,并写回到浏览器。
3)再次访问浏览器,可以获取cookie数据。
package cookie;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置编码
response.setContentType("text/html;charset=utf-8");
//2.创建cookie cookie由服务器创建,并携带给浏览器
Cookie a=new Cookie("akey","avalue");
//3.由服务器写回到浏览器
response.addCookie(a);//响应头cookie:akey=avalue
Cookie b=new Cookie("bkey","bvalue");
Cookie c=new Cookie("ckey","cvalue");
Cookie d=new Cookie("dkey","dvalue");
response.addCookie(b);
response.addCookie(c);
response.addCookie(d);
response.getWriter().write("cookie已经写回了");
//4.获取cookie的数据
Cookie[] cookies=request.getCookies();
//先判断,再使用
if(cookies!=null){
for(Cookie cookie:cookies){
System.out.println(cookie.getName()+"="+cookie.getValue());
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
结果:
在谷歌浏览器中的设置-高级-内容设置-Cookie-查看所有cookie和网站数据中可以看到
3.记录上一次访问的时间
步骤分析:
创建一个Servlet:RememberServlet url-pattern:/rem
1)假设cookie名称:lastTime new Cookie("lastTime",long类型的系统时间);
2)public Cookie[] getCookies():通过api获取指定名称的cookie。
3)判断当前获取到的cookie是否为空,如果为空,提示”您是第一次访问“;
如果不为空,获取当前指定名称的cookie值,lastTime.
String-->Long :parseLong(value)-->long---->Date对象-->toLocalString()"提示您上次访问的时间是+toLocalString"
4)把当前的系统时间记录下来 :new Cookie("lastTime",currentTime);
5)由服务器将cookie携带给浏览器, addCookie(cookie);
package com.xunpu.rem;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
@WebServlet(name = "RemberServlet")
public class RemberServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置编码格式
response.setContentType("text/html;charset=utf-8");
PrintWriter writer=response.getWriter();//通过writer向浏览器中输出内容
//2.获取指定的cookie(名称为:lastTime)
//从指定的方法中获取指定的cookie
Cookie cookie=getByName("lastTime",request.getCookies());
//3.判断当前的cookie
if(cookie==null){
//3.1 如果为空,直接提示当前是第一次访问
writer.write("您当前是第一次访问");
}else {
//3.2 若不为空,获取当前指定的cookie内容--->Date的日期字符串形式(提示上一次访问的时间是)
String value=cookie.getValue();
//value-->long-->Date
long time=Long.parseLong(value);
//创建一个Date对象
Date date=new Date(time);//SimpleDateFormat
writer.write("您上一次访问的时间是:"+date.toLocaleString());//输出本地时间字符串
}
//4.记录当前的系统时间
cookie=new Cookie("lastTime",new Date().getTime()+"");
//设置会话有效期为1小时
cookie.setMaxAge(3600);
//获取上下文路径
// cookie.setPath(request.getContextPath());
//5.写回浏览器
response.addCookie(cookie);
}
/**
* 通过指定的名称获取对应的cookie
* @param name 指定名称
* @param cookies 当前浏览器中的所有的cookie数据
* @return
*/
public Cookie getByName(String name,Cookie[] cookies){
if(cookies!=null){
//遍历所有的cookie
for(Cookie c:cookies){
//判断当前的name名称就是需要的cookie
if(name.equals(c.getName())){
return c;
}
}
}
return null;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}