网页浏览历史纪录(Cookie技术)

一、实现原理:

  1. 首先创建一个Cookie用于记录访问网页的编号:或者商品的编号
  2. 每次访问完就往这个Cookie中更新新的数据(新建Cookie重新添加,主要用于访问的页面在原有历史纪录中已经存在,需要删除原有纪录重新添加)
  3. 在需要显示的历史纪录的数据准备页面进行获取,然后转发给显示JSP页面,进行显示。

二、DEMO

图书数据准备页面:ShowBookList (Servlet)

  1. package com.heima.demo1;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.LinkedHashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import javax.servlet.ServletContext;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.http.Cookie;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import com.heima.beans.Book;
  14. public class ShowBookList extends HttpServlet
  15. {
  16. /**
  17. * Destruction of the servlet. <br>
  18. */
  19. public void destroy()
  20. {
  21. super.destroy(); // Just puts "destroy" string in log
  22. // Put your code here
  23. }
  24. public void doGet(HttpServletRequest request, HttpServletResponse response)
  25. throws ServletException, IOException
  26. {
  27. // 准备图书信息
  28. ServletContext context = this.getServletContext();
  29. Map<String, Book> map = (Map<String, Book>) context.getAttribute("map");
  30. request.setAttribute("map", map);
  31. // 取出历史纪录
  32. List<Book> history = new ArrayList<Book>();
  33. Cookie[] cookies = request.getCookies();
  34. // 判断cookies是否为空,很重要,否者会出现无法获取数据,
  35. // 和空指针异常的错误
  36. if (cookies != null)
  37. {
  38. //遍历cookie数组
  39. for (Cookie c : cookies)
  40. {
  41. //找到带有历史信息的cookie
  42. if ("ids".equals(c.getName()))
  43. {
  44. //获取其中的数据
  45. String ids = c.getValue();
  46. //把原有的数据,切割成数组,取出每个书的编号信息
  47. String[] split = ids.split("-");
  48. for (String s : split)
  49. {
  50. //通过编号信息,取出对应的书
  51. Book b = map.get(s);
  52. // 把所有的书添加到一个list集合中,方便数据的传递
  53. history.add(b);
  54. }
  55. //把数据设置到request域中
  56. request.setAttribute("history", history);
  57. }
  58. }
  59. }
  60. // 把准备好的数据发送到页面进行显示
  61. request.getRequestDispatcher("/showBookList.jsp").forward(request,
  62. response);
  63. }
  64. public void doPost(HttpServletRequest request, HttpServletResponse response)
  65. throws ServletException, IOException
  66. {
  67. doGet(request, response);
  68. }
  69. public void init() throws ServletException
  70. {
  71. //进行图书页面的显示图书的数据准备
  72. Map<String, Book> map = new LinkedHashMap<String, Book>();
  73. for (int i = 0; i < 10; i++)
  74. {
  75. Book b = new Book();
  76. b.setId(i + "");
  77. b.setName("java" + i);
  78. b.setNum(i);
  79. b.setPrice((i + 20) + "");
  80. // System.out.println(i);
  81. map.put(b.getId(), b);
  82. }
  83. //把拥有图书数据的map集合放到ServletContext域中,给所有程序共享
  84. this.getServletContext().setAttribute("map", map);
  85. }
  86. }

图书展示页面:showBookList.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <c:forEach items="${requestScope.map }" var="entry">
  12. <h2><a href="/Test5/showBookInfo?id=${entry.key}">《${entry.value.name }》</a></h2>
  13. </c:forEach>
  14. <h3>您浏览过的图书如下</h3>
  15. <c:forEach items="${requestScope.history}" var="book">
  16. <h2>《${book.name}》</h2>
  17. </c:forEach>
  18. </body>
  19. </html>

图书具体信息准备:ShowBookInfo (Servlet)

  1. package com.heima.demo1;
  2. import java.io.IOException;
  3. import java.util.Arrays;
  4. import java.util.LinkedList;
  5. import java.util.List;
  6. import java.util.Map;
  7. import javax.servlet.ServletContext;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.http.Cookie;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import com.heima.beans.Book;
  14. public class ShowBookInfo extends HttpServlet
  15. {
  16. /**
  17. * Destruction of the servlet. <br>
  18. */
  19. public void destroy()
  20. {
  21. super.destroy(); // Just puts "destroy" string in log
  22. // Put your code here
  23. }
  24. public void doGet(HttpServletRequest request, HttpServletResponse response)
  25. throws ServletException, IOException
  26. {
  27. // 获取ServletContext域中的map集合
  28. ServletContext context = this.getServletContext();
  29. Map<String, Book> map = (Map<String, Book>) context.getAttribute("map");
  30. // 获取图书编号
  31. String key = request.getParameter("id");
  32. Book b = map.get(key);
  33. // 创建浏览记录
  34. Cookie[] cookies = request.getCookies();
  35. // 用于判断是否是第一次访问
  36. boolean flag = true;
  37. // 判断cookies是否为空,很重要,否者会出现无法获取数据,
  38. // 和空指针异常的错误
  39. if (cookies != null)
  40. {
  41. //遍历数组
  42. for (Cookie cook : cookies)
  43. {
  44. //取出我们需要的历史纪录的数据
  45. if ("ids".equals(cook.getName()))
  46. {
  47. //如果有数据说明不是第一访问,把开关置为false
  48. flag = false;
  49. //获取cookie保存的数据
  50. String ids = cook.getValue();
  51. //按格式切割出我们原来的数据,这里是图书的编号
  52. String[] split = ids.split("-");
  53. //把数组转换为集合方便操作
  54. List<String> asList = Arrays.asList(split);
  55. LinkedList<String> list = new LinkedList(asList);
  56. //如果集合中包含当前访问的页面
  57. if (list.contains(key))
  58. {
  59. //把集合中的历史纪录删除
  60. list.remove(key);
  61. }
  62. //重新添加当前访问页面的纪录,添加在首歌
  63. list.addFirst(key);
  64. //把集合中的数据重新拼接成字符串数据,给Cookie保存
  65. StringBuffer sb = new StringBuffer();
  66. //只需要最大4次的访问记录
  67. for (int i = 0; i < list.size() && i < 4; i++)
  68. {
  69. sb.append(list.get(i));
  70. sb.append("-");
  71. }
  72. //把字符串末尾的“-”去除
  73. ids = sb.substring(0, sb.length() - 1);
  74. // System.out.println(ids);
  75. //重新创建一个名为ids的Cookies
  76. Cookie c = new Cookie("ids", ids);
  77. //向response域添加Cookie,覆盖原有Cookie
  78. response.addCookie(c);
  79. }
  80. }
  81. }
  82. //判断开关,如果为真则是第一次访问
  83. if (flag)
  84. {
  85. //新建名为ids的Cookie,保存当前访问的数据
  86. Cookie c = new Cookie("ids", key);
  87. //添加Cookie
  88. response.addCookie(c);
  89. }
  90. // 获取准备图书信息
  91. request.setAttribute("book", b);
  92. //把准备好的数据发送到显示页面
  93. request.getRequestDispatcher("/showBookInfo.jsp").forward(request,
  94. response);
  95. }
  96. public void doPost(HttpServletRequest request, HttpServletResponse response)
  97. throws ServletException, IOException
  98. {
  99. doGet(request, response);
  100. }
  101. /**
  102. * Initialization of the servlet. <br>
  103. *
  104. * @throws ServletException
  105. * if an error occurs
  106. */
  107. public void init() throws ServletException
  108. {
  109. }
  110. }

图书具体信息显示页:showBookInfo.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <h1>图书的详细信息</h1>
  11. <h3>图书名称:《${requestScope.book.name }》</h3>
  12. <h3>图书价格:${requestScope.book.price }</h3>
  13. <h3>图书描述:${requestScope.book.description }</h3>
  14. <h2><a href="/Test5/showBookList">返回图书列表</a></h2>
  15. </body>
  16. </html>

来自为知笔记(Wiz)

附件列表

时间: 2024-11-10 11:29:39

网页浏览历史纪录(Cookie技术)的相关文章

Cookie案例-显示商品浏览历史纪录

1 package cn.itcast.cookie; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.Date; 6 import java.util.HashMap; 7 import java.util.LinkedHashMap; 8 import java.util.Map; 9 10 import javax.servlet.ServletException; 11 im

网页浏览历史

题目描述 标准的网页浏览器都提供一个功能:保留最近浏览过页面的历史记录.通过后退或向前按钮就能在历史记录之间跳转. 现在,请你模拟这个功能,接收如下三条指令: 1. BACK:回退功能,即回退到上一个访问的页面: 2. FORWARD:使用BACK返回上一页之后,可以使用FORWARD回到下一页: 3. VISIT url:访问指定url的页面,并且所有FORWARD的页面都被清空. 输入描述: 输入包含多组数据,每组数据第一行包含一个正整数n(1≤n≤100). 紧接着有n行,每一行包含一条指

cookie技术案例-用户浏览商品的记录

1引言 你点击了桌面上的Chrome图标,一个浏览器窗口出现了,输入网址就可以在Internet世界愉快玩耍.这一切是怎么实现的呢?Chromium这个多进程的程序是如何启动各个进程的呢?浏览器主进程(界面进程)启动了哪些线程?如何启动的呢?这些问题一直萦绕在心头,一起来看看源代码吧.本文主要针对Chromium for Mac的源代码,其它操作系统大同小异. 2背景知识 浏览器作为一个应用程序,是以进程的形式运行在操作系统上的.首先,Chromium是一个多进程的应用程序,我们需要了解Chro

PHP实现将浏览历史页面网址保存到cookie的方法

这篇文章主要介绍了PHP实现将浏览历史页面网址保存到cookie的方法,涉及php对cookie的读取.字符串转化及保存等技巧,需要的朋友可以参考下 本文实例讲述了PHP实现将浏览历史页面网址保存到cookie的方法.分享给大家供大家参考.具体如下: 将浏览历史页面网址保存到cookie,大致的思路如下面的代码,与实际应用有些差别. 代码如下: <?php /*******  说明:cookie只能保存字符串 本实例中,需要保存多个URL(历史访问记录),思路是先将URL数组转为字符串,然后保存

12 款不能少的使网页浏览获得的最佳体验Chrome 扩展

原文地址:http://whosmall.com/?post=414 本文标签: Chrome扩展 网页浏览体验 引擎划词翻译工具 Chrome浏览器 相信不少朋友和我一样,每安装新的操作系统之后,都会使用 Safari/IE 下载 Chrome 浏览器,然后将后者作为主力上网浏览器,而将前者束之高阁.毕竟从体验上说,Chrome拥有快速流畅的浏览体验,当然强大丰富的扩展也是让我一见倾心的关键. 此前我们向各位介绍了数款颇受欢迎的 Chrome 扩展,而今天笔者我起一回私心,给大家安利一些我正在

黑马day05 Cookie技术入门&amp;记录上次访问的时间

1.Cookie技术: 客户端技术 Cookie是基于set-Cookie响应头和Cookie请求头工作的,服务器可以发送set-Cookie请求头命令浏览器保存一个cookie信息,浏览器会在访问服务器时以Cookie请求头的方式带回之前保存的信息 request.getCookies(); response.addCookie(Cookie c); new  Cookie(String name,String value)//Cookie在构造的时候就需要设定好cookie的名字和值 get

会话管理之Cookie技术

会话管理是web开发中比较重要的环节,这一节主要总结下会话管理中的cookie技术. 1. 何为会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称为一个会话. 1.1 会话过程中要解决的问题 1)每个用户在使用浏览器与服务器进行会话的过程中,不可避免会各自产生一些数据,程序要想办法为每个用户保存这些数据.        2)如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用于点结账serv

如何监控HTTPS网页浏览?

HTTPS就是HTTP over SSL(通过SSL加密的HTTP网页浏览协议),而SSL采用了非对称密钥的加密方式,在目前的硬件条件下,不知道私钥是不可能解密SSL的密文的. 对于HTTP的网页浏览内容,"WFilter(超级嗅探狗)"和"WFilter上网行为管理系统(WFilter NGF)"无需额外配置,都可以直接记录网址.网页标题和浏览器类型.但是,对于https的访问,默认情况下,只能记录域名.如下图: 1. WFilter上网行为管理系统的网页访问监控

Cookie中图片的浏览记录与cookie读取servle时路径的设置(文字描述)

public class ShowServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletR