##会话技术介绍 ###什么是会话技术 会话能够简单理解为:用户开一个浏览器,点击多个超连接,访问服务器多个web资源而后关闭浏览器,整个过程称之为一个会话。 ###会话过程要解决的一些问题 每一个用户与服务器进行交互的过程当中,各自会有一些数据,程序要想办法保存每一个用户的数据, 例如:用户点击点击超连接经过一个servlet购买一个商品,程序应该保存用户购买的产品,以便于用户点结帐时,结帐servlet能够获得用户商品为用户结帐。 question:用户购买的商品保存在request或servletContext行不行 answer:不行 ##保存会话数据的两种技术 cookie是客户端技术, 程序把每一个用户的数据,以cookie的形式写给用户各自的浏览器,当浏览器再去访问服务器中的web资源时,就会带着各自的数据去,这样,web资源处理的就是用户各自的数据了。html
session是服务端技术 利用这个技术,服务器在运行时能够为每个用户的浏览器建立一个其独享的session对象,因为session是用户浏览器对象,因此用户在访问服务器的web资源时,能够把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它资源再从用户各自的session中取出数据为用户服务。
##cookie案例 ###cookie api javax.servlet.http.cookie类用户建立一个cookie,response接口中也定义了一个addCookie方法,它用于在其响应头中增长一个相应的set-cookie头字段。一样,request接口中也定义了一个getCookies方法,它用于获取客户提交的cookie。 cookie类的方法:java
生成cookie的代码web
Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis()); cookie.setMaxAge(10); cookie.setPath("/day07"); response.addCookie(cookie);
删除cookie cookie.setMaxAge(0); 用js也能够删除Cookie ##显示用户上次访问的时间api
response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.print("你上次的访问时间是:"); Cookie cookies[] = request.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { if (cookies[i].getName().equals("lastAccessTime")) { long cookieValue = Long.parseLong(cookies[i].getValue()); Date date = new Date(cookieValue); pw.print(date.toLocaleString()); } } Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis() + ""); cookie.setMaxAge(120); cookie.setPath(request.getContextPath()); response.addCookie(cookie);
##cookie的细节浏览器
*. 一个cookie职能标识一种信息,它至少含有一个标识该信息的名称(name)和值(value)服务器
*. 一个web站点能够给一个web浏览器发送多个Cookie,一个WEB浏览器也能够存储多个web站点提供的cookie。cookie
*. 浏览器通常只容许存放300个cookie,每一个站点最多存放20个cookie,每一个cookie的大小限制为4KB。session
*. 若是建立一个cookie,并将他发送到浏览器,默认状况下它是一个会话级别的cookie(存储在浏览器的内存中),用户推出浏览器以后即被删除。若但愿浏览器将该cookie存储在磁盘上,则须要使用setMaxAge,并给出一个以秒为单位的时间。将最大实效设为0则是命令浏览器删除该cookie。app
*. 删除cookie时,path必须一致,不然不会删除。网站
##cookie案例:显示用户浏览历史纪录
public class ViewallServlet extends HttpServlet { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.write("本网站有以下商品: </br>"); Map<Integer, Book> map = Db.getAll(); Set<Entry<Integer, Book>> entrySet = map.entrySet(); for (Entry<Integer, Book> entry : entrySet) { Book book = entry.getValue(); out.print("<a href=/test-web/BuybookServlet?id=" + entry.getKey() + ">" + book.getName() + "</a><br/>"); } // 显示用户曾经看过的商品 Cookie[] cookies = request.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { Cookie cookie = cookies[i]; if (cookie.getName().equals("bookHistory")) { String value = cookie.getValue(); if (value == null) { return; } System.out.println(value); String[] ids = value.split(","); for (String id : ids) { out.print("浏览过的商品</br>"); out.print(Db.getAll().get(Integer.valueOf(id)).getName() + "</br>"); } } } }
public class BuybookServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); Book book = Db.getAll().get(Integer.valueOf(id)); PrintWriter pw = response.getWriter(); pw.print(book.getId() + "</br>" + book.getName()); // 构建cookie,回写浏览器 String cookieValue = buildCookie(id, request); Cookie cookie = new Cookie("bookHistory", cookieValue); cookie.setMaxAge(600); cookie.setPath(request.getContextPath()); response.addCookie(cookie); } private String buildCookie(String id, HttpServletRequest request) { String bookHistory = null; Cookie cookies[] = request.getCookies(); if (cookies == null) { return id; } for (Cookie cook : cookies) { if (cook.getName().equals("bookHistory")) { bookHistory = cook.getValue(); break; } } if (bookHistory == null) { return id; } LinkedList<String> list = new LinkedList<String>(); String[] splits = bookHistory.split("\\,"); for (String split : splits) { list.addFirst(split); } if (list.isEmpty()) { return id; } if (list.contains(id)) { list.remove(id); list.addFirst(id); } else { if (list.size() > 3) { list.removeLast(); list.addFirst(id); } else { list.addFirst(id); } } StringBuffer buffer = new StringBuffer(); for (String bid : list) { buffer.append(bid).append(","); } buffer.deleteCharAt(buffer.length()-1); return buffer.toString(); } }