深入理解 cookie和session
为什么需要cookie和session?
设想一下,一个网站如何才能记住你是否访问过呢?
这里有两个解决方案:
1.给你发一个带有网站logo会员卡,当你再次访问时网站会检查你是否持有印着网站logo的会员卡,从而得知你是否访问过
2.记录你的会员id,并且将会员id印在会员卡上,下次访问时将会员卡上的id与网站记录过的id进行比对,查看是否存在相同id
这里的解决方案1就是cookie,解决方案2为session
做一个小Demo来演示,访问一个网站,如果是第一次访问本站则网站提醒用户这是第一次访问,否则给出上次的访问时间
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
//服务器从客户端获取cookie
Cookie[] cookies = req.getCookies();
//判断Cookie是否存在
if(cookies!=null){
//如果存在
writer.write("你上一次访问的时间是:");
for(int i=0;i<cookies.length;i++){
if("lastLoginTime".equals(cookies[i].getName())){
//获取cookie中的值,注意解码
long lastLoginTime = Long.parseLong(
URLDecoder.decode(cookies[i].getValue(),"utf-8"));
Date date = new Date(lastLoginTime);
writer.write(date.toLocaleString());
}
}
}else {
writer.write("这是您第一次访问本站:");
}
//给客户端一个新的cookie,注意编码
Cookie cookie = new Cookie("lastLoginTime", URLEncoder.encode(System.currentTimeMillis() + "","utf-8"));
resp.addCookie(cookie);
}
这是第一次访问网站时的页面,lastLoginName就是上文的会员卡logo
当下次访问时服务器会对比cookie的名字是否是lastLoginName,是的话则给出上次访问时间
cookie的本质其实是一个键值对,服务器每次对key进行比对,相等则记住用户,value可以保存用户的各种信息
保存在客户端,当访问时客户端即浏览器携带cookie发起Request请求
session的原理和cookie差不多,不过session是保存在服务端,当访问第一次网站时,服务器记录用户一个id,这个id值保存在服务器端,起名为JSESSIONID,例如这里的FFXXX就是id值,同时给客户端一个cookie,cookie的key值为JSESSIONID,value值为FFXXX,下次访问是将JSESSIONID的值进行比对,相等则访问过本站,其实可以这样理解,session是客户端和服务端都保存一个相同的cookie。
//session创建的时候做了什么事
Cookie jsessionid = new Cookie("JSESSIONID", sessionId);
resp.addCookie(jsessionid);
session在访问tomcat服务器HttpServletRequest的getSession(true)的时候创建,tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
//得到Session
HttpSession session =req.getSession();
//给Session中存东西
session.setAttribute("name",new Person("evolution",1));
//获取Session的id
String sessionId=session.getId();
//判断Session是不是新创建
if(session.isNew()){
resp.getWriter().write("session创建成功,ID:"+sessionId);
}else{
resp.getWriter().write("session已经在服务器中存在了,ID:"+sessionId);
}
session的value可以保存一个对象,比如一个用户的信息
cookie和session的对比:
1.如果没有设置setMaxAge,则cookie的生命周期当浏览器关闭的时候,就消亡了
2.服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟,再次访问则重新计算
3.每个浏览器访问网站session都不同,而cookie可以供多个浏览器使用
4.一个网站可以发多个cookie给浏览器,最多20个,一个cookie只能保存一个信息
删除一个cookie,可以设置setMaxAge()时间为0
删除一个session,session.invalidate()