基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话.
会话跟踪技术可以解决我们很多很多问题。
会话跟踪技术有Cookie和Session,Cookie技术是先出现的。我们先讲Cookie技术吧。
Cookie是由W3C组织提出,最早由netscape社区发展的一种机制
Cookie的流程:浏览器访问服务器,如果服务器需要记录该用户的状态,就使用response向浏览器发送一个Cookie,浏览器会把Cookie保存起来。当浏览器再次访问服务器的时候,浏览器会把请求的网址连同Cookie一同交给服务器。
常用的Cookie方法:
//设置response的编码 response.setContentType("text/html;charset=UTF-8"); //创建Cookie对象,指定名称和值 Cookie cookie = new Cookie("username", "zhongfucheng"); //向浏览器给一个Cookie response.addCookie(cookie); response.getWriter().write("我已经向浏览器发送了一个Cookie");
//设置Cookie的时间 cookie.setMaxAge(1000);
response.setContentType("text/html;charset=UTF-8"); PrintWriter printWriter = response.getWriter(); String name = "中国"; Cookie cookie = new Cookie("country", name); cookie.setMaxAge(2000); response.addCookie(cookie); printWriter.write("我颁发了一个Cookie,值保存的是中文数据");
//对Unicode字符进行编码 Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));
Cookie[] cookies = request.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { String name = cookies[i].getName(); //经过URLEncoding就要URLDecoding String value = URLDecoder.decode(cookies[i].getValue(), "UTF-8"); printWriter.write(name + "------" + value); }
Cookie的有效期是通过setMaxAge()来设置的。
String name = "看完博客就点赞"; //对Unicode字符进行编码 Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));
String name = "看完博客就点赞"; //对Unicode字符进行编码 Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8")); //一定不要忘记添加到浏览器中 cookie.setMaxAge(0); response.addCookie(cookie); printWriter.write("我删除了该Cookie");
String name = "看完博客就点赞"; //对Unicode字符进行编码 Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8")); //一定不要忘记添加到浏览器中 cookie.setMaxAge(10000); response.addCookie(cookie);
//一定不要忘记添加到浏览器中 cookie.setPath("/ouzicheng"); cookie.setMaxAge(0); response.addCookie(cookie); printWriter.write("删除一个Cookie");
Cookie的domain属性决定运行访问Cookie的域名。domain的值规定为“.域名”
Cookie cookie = new Cookie("name", "zhongfucheng"); cookie.setMaxAge(1000); response.addCookie(cookie); printWriter.write("使用www.zhongfucheng.com域名添加了一个Cookie");
Cookie cookie = new Cookie("name", "ouzicheng"); cookie.setMaxAge(1000); cookie.setDomain(".zhongfucheng.com"); response.addCookie(cookie); printWriter.write("使用www.zhongfucheng.com域名添加了一个Cookie,只要一级是zhongfucheng.com即可访问");
Cookie的path属性决定允许访问Cookie的路径
Cookie cookie = new Cookie("username", "java"); cookie.setPath("/Servlet1"); cookie.setMaxAge(1000); response.addCookie(cookie); printWriter.write("该Cookie只有Servlet1获取得到");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); response.setContentType("text/html;charset=UTF-8"); PrintWriter printWriter = response.getWriter(); //获取网页上所有的Cookie Cookie[] cookies = request.getCookies(); //判断Cookie的值是否为空 String cookieValue = null; for (int i = 0; cookies != null && i < cookies.length; i++) { //获取到以time为名的Cookie if (cookies[i].getName().equals("time")) { printWriter.write("您上次登陆的时间是:"); cookieValue = cookies[i].getValue(); printWriter.write(cookieValue); cookies[i].setValue(simpleDateFormat.format(new Date())); response.addCookie(cookies[i]); //既然已经找到了就可以break循环了 break; } } //如果Cookie的值是空的,那么就是第一次访问 if (cookieValue == null) { //创建一个Cookie对象,日期为当前时间 Cookie cookie = new Cookie("time", simpleDateFormat.format(new Date())); //设置Cookie的生命期 cookie.setMaxAge(20000); //response对象回送Cookie给浏览器 response.addCookie(cookie); printWriter.write("您是第一次登陆啊!"); }
private String id ; private String name ; private String author; public Book() { } public Book(String id, String name, String author) { this.id = id; this.name = name; this.author = author; } ...各种set、get方法
private static LinkedHashMap<String, Book> linkedHashMap = new LinkedHashMap(); //简化开发复杂度,book的id和商品的id相同 static { linkedHashMap.put("1", new Book("1", "javaweb", "zhong")); linkedHashMap.put("2", new Book("2", "java", "fu")); linkedHashMap.put("3", new Book("3", "oracle", "cheng")); linkedHashMap.put("4", new Book("4", "mysql", "ou")); linkedHashMap.put("5", new Book("5", "ajax", "zi")); } //获取到所有书籍 public static LinkedHashMap getAll() { return linkedHashMap; }
printWriter.write("网页上所有的书籍:"+"<br/>"); //拿到数据库所有的书 LinkedHashMap<String, Book> linkedHashMap = DB.getAll(); Set<Map.Entry<String, Book>> entry = linkedHashMap.entrySet(); //显示所有的书到网页上 for (Map.Entry<String, Book> stringBookEntry : entry) { Book book = stringBookEntry.getValue(); printWriter.write(book.getId() +" "+ book.getName()+"<br/>"); }
//显示所有的书到网页上 for (Map.Entry<String, Book> stringBookEntry : entry) { Book book = stringBookEntry.getValue(); printWriter.write("<a href='/ouzicheng/Servlet2?id=" + book.getId() + "''target=_blank' +" + book.getName() + "</a>"); printWriter.write("<br/>"); }
String id = request.getParameter("id"); //由于book的id和商品的id是一致的。获取到用户点击的书 Book book = (Book) DB.getAll().get(id); //输出书的详细信息 printWriter.write("书的编号是:" + book.getId()+"<br/>"); printWriter.write("书的名称是:" + book.getName()+"<br/>"); printWriter.write("书的作者是:" + book.getAuthor()+"<br/>");
String bookHistory = null; Cookie[] cookies = request.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { if (cookies[i].getName().equals("bookHistory")) { bookHistory = cookies[i].getValue(); } }
if (bookHistory == null) { return id; } //如果Cookie的值不是null的,那么就分解Cookie的得到之前的id。 String[] strings = bookHistory.split("\\_"); //为了增删容易并且还要判断id是否存在于该字符串内-----我们使用LinkedList集合装载分解出来的id List list = Arrays.asList(strings); LinkedList<String> linkedList = new LinkedList<>(); linkedList.addAll(list); if (linkedList.contains(id)) { linkedList.remove(id); linkedList.addFirst(id); }else { if (linkedList.size() >= 3) { linkedList.removeLast(); linkedList.addFirst(id); } else { linkedList.addFirst(id); } }
StringBuffer stringBuffer = new StringBuffer(); //遍历LinkedList集合,添加个下划线“_” for (String s : linkedList) { stringBuffer.append(s + "_"); } //最后一个元素后面就不需要下划线了 return stringBuffer.deleteCharAt(stringBuffer.length() - 1).toString();
String bookHistory = makeHistory(request, id); Cookie cookie = new Cookie("bookHistory", bookHistory); cookie.setMaxAge(30000); response.addCookie(cookie);
printWriter.write("您曾经浏览过的商品:"); printWriter.write("<br/>"); //显示用户浏览过的商品 Cookie[] cookies = request.getCookies(); for (int i = 0; cookies != null && i < cookies.length; i++) { if (cookies[i].getName().equals("bookHistory")) { //获取到的bookHistory是2_3_1之类的 String bookHistory = cookies[i].getValue(); //拆解成每一个id值 String[] ids = bookHistory.split("\\_"); //得到每一个id值 for (String id : ids) { //通过id找到每一本书 Book book = linkedHashMap.get(id); printWriter.write(book.getName()); printWriter.write("<br/>"); } break; } }
如果文章有错的地方欢迎指正,大家互相交流。
本文分享自微信公众号 - Java3y(gh_085b56c42174),作者:Java_3y
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2018-02-03
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句