会话:会话可以理解为用户打开浏览器,点击多个超链接,访问服务器上的多个web资源,然后关闭浏览器,整个过程称为一个会话。
会话要解决的问题:每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每一个用户保存这些数据,这就是会话要解决的问题。
解决会话问题的两种技术:
Cookie:Cookie是客户端技术,程序把每一个用户的数据以cookie的形式写给用户各自的浏览器,当用户使用浏览器再次访问服务器中的web资源时,就会带着各自的数据
这样web资源处理的就是用户各自的数据。
* 一般浏览器对一个完整仅支持20个cookie,所以网站合计支持300个cookie,而且cookie大小不能超过4kb,且不能存中文数据。
*domain+path+name 唯一确定一个cookie
常用API:public Cookie(String name, String value);
setValue() 、getValue()
setMaxAge()、getMaxAge() 单位:秒 (默认情况下,cookie被存储在浏览器线程中,浏览器关闭cookie小时,若想设置cookie长期有效,可以为cookie制定
MaxAge,此时cookie就会被保存在浏览器缓存中)
setPath() 、 getPath()
setDomain()、getDomain()
getName()
HttpSession:Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个独享的HttpSession对象,由于session为用户浏览器独享,
所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的web资源时,其他web资源再从各自的session中取
出数据为用户服务。
Session以基于Cookie的服务器端会话技术:
HttpSession对象的状态转换:
注:在编写bean的时候要注意实现Serializable接口,以防止bean对象在被放入session 的情况下,改sesion对象被持久化的时候报错。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter pw = resp.getWriter();
//Get all cookies
Cookie[] cookies = req.getCookies();
//iterate cookies
for(int i = 0; cookies!=null && i < cookies.length; i ++){
Cookie cookie = cookies[i];
if("lasttime".equals(cookie.getName())){
String value = cookie.getValue();
Date time = new Date(Long.parseLong(value));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String lasttime = sdf.format(time);
pw.write(lasttime);
}
}
/*
* delete cookie
* for(int i = 0; cookies!=null && i < cookies.length; i ++){
Cookie cookie = cookies[i];
if("lasttime".equals(cookie.getName())){
cookie.setMaxAge(0);
resp.addCookie(cookie);
break;
}
or
Cookie coo = new Cookie("lasttime","");
coo.setMaxAge(0);
resp.addCookie(coo);
}*/
//update last time
Cookie coo = new Cookie("lasttime",System.currentTimeMillis() + "");
coo.setPath(req.getContextPath());
coo.setMaxAge(Integer.MAX_VALUE);
resp.addCookie(coo);
}