保存会话数据的两种技术
Cookie
Cookie 是客户端技术,程序把每个用户的数据以cookie的形式写给用户的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。web资源处理的就是用户各自的数据了。
HttpSession
session是服务端技术,服务器在运行时可以为每个用户的浏览器创建一个独享的HttpSession对象,由于session为用户浏览器独享,所以用户再次访问时会拿取session中数据。
案例一:使用cookie记录上次访问的时间
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //拿到客户端携带的记录上次访问时间的cookie:加上cookie的名字是lastaccesstime,值是一个long类型额数字 //拿到客户端携带的所有的cookie Cookie[] c = request.getCookies(); //循环判断,拿到需要的cookie for (int i = 0; c != null&&i < c.length ; i++) { Cookie cookie = c[i]; if(cookie.getName().equals("lastaccesstime")){ out.write("你上次访问的时间是:"); String time = cookie.getValue(); //time-->long long t = Long.parseLong(time); //formate SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //create a date object Date d = new Date(t); //output out.write(sdf.format(d) + " <a href=''>清除cookie</a>"); } } //向客户端发送cookie Cookie nc = new Cookie("lastaccesstime",new Date().getTime()+"");
//设置缓存时间,放到硬盘上,不在缓存中,默认cookie的生命周期就是一个会话
nc.setMaxAge(Integer.MAX_VALUE);
//发送到客户端 response.addCookie(nc); }
删除客户端cookie
因为没有删除cookie的方法,所以通过添加新的cookie来覆盖之前的cookie
" <a href='"+ request.getContextPath() + "/servlet/cookie2" +"'>清除cookie</a>"
cookie2
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //没有删除的方法,所以就创建一个同名的cookie,将存活时间设置为0,覆盖客户端原来的cookie Cookie c = new Cookie("lastaccesstime","");//不需要设置值,就是为了失效,根本用不到 c.setMaxAge(0); //发送到客户端 response.addCookie(c); }
获取上次的cookie
需要指定cookie的路径,只有cookie的路径和访问路径对应才能获取:
设置路径
nc.setPath(request.getContextPath());
获取cookie
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.write("你上次访问的时间是:"); //需要设置浏览器携带cookie的路径 //拿到所有的cookie Cookie[] cs = request.getCookies(); //拿到记录上次访问时间的cookie for (int i = 0; cs != null && i < cs.length; i++) { Cookie c = cs[i]; if(c.getName().equals("lastaccesstime")){ String value = c.getValue(); out.write(value); } } }
cookie是否为唯一 :域名 + 访问路径 + Cookie的名字