cookie案例之显示用户上次浏览过的商品

2024-06-08 01:08

本文主要是介绍cookie案例之显示用户上次浏览过的商品,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//网站首页
public class CookieDemo2 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//有中文输入,防止乱码response.setContentType("text/html;charset=UTF-8");response.setCharacterEncoding("UTF-8");PrintWriter  out = response.getWriter();//1.显示网站所有商品//print与write的区别在于有换行out.print("本网站有如下书籍:<br/>");Map<String,Book> map = DB.getMap();for(Map.Entry<String, Book> entry : map.entrySet()){Book book = entry.getValue();out.print("<a href='/day07/servlet/CookieDemo3?id="+book.getId()+"' target='_blank'>"+book.getName()+"</a><br/>");}out.print("您曾经看过如下商品:<br/>");//2.显示用户曾经浏览过的商品    //   bookHistoryCookie cookie = null;Cookie cookies[] = request.getCookies();for(int i=0;cookies!=null && i<cookies.length;i++){if(cookies[i].getName().equals("bookHistory")){cookie = cookies[i];}}if(cookie!=null){//找到了bookHistory这个cookie//值为这样的:4_6_1String bookHistory = cookie.getValue(); //以_分割字符串,需要转义String ids[] = bookHistory.split("\\_");for(String id: ids){Book book = (Book) DB.getMap().get(id);out.print(book.getName() + "<br/>");}}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}//此类用于模拟数据库
class DB{//用map集合的原因为要用到检索数据的需求private static Map<String,Book> map = new HashMap();static{map.put("1", new Book("1","javaweb开发","老张"));map.put("2", new Book("2","jdbc开发","老黎"));map.put("3", new Book("3","struts2开发","老张"));map.put("4", new Book("4","spring开发","老黎"));map.put("5", new Book("5","hibernate开发","老张"));}//提供方法返回map集合public static Map getMap(){return map;}
}
class Book{private String id;private String name;private String author;public Book() {super();// TODO Auto-generated constructor stub}public Book(String id, String name, String author) {super();this.id = id;this.name = name;this.author = author;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}
}//显示商品详细信息
public class CookieDemo3 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");response.setCharacterEncoding("UTF-8");PrintWriter  out = response.getWriter();//1.根据用户带过来的id值,显示相应商品的信息out.print("您想看的书的详细信息为:<br/>");String id = request.getParameter("id");Book book = (Book) DB.getMap().get(id);out.print(book.getId() + "<br/>");out.print(book.getName() + "<br/>");out.print(book.getAuthor() + "<br/>");//2.以cookie的形式回写该商品的id号给浏览器String bookHistory = makeCookie(book.getId(),request);Cookie cookie = new Cookie("bookHistory",bookHistory);cookie.setMaxAge(10000);response.addCookie(cookie);}//根据用户原来看过的书,以及现在看的书的id,构建新的cookie值(要求浏览历史只能保存3本书)private String makeCookie(String id, HttpServletRequest request) {//有以下四种情况//首次看id为3的书//bookHistory=null    3     bookHistory=3//浏览历史有三个了,但不包含id等于3的书,要删除最后一个再把3加在开头//bookHistory=2_1_5   3     bookHistory=3_2_1//浏览历史不超过3个,直接把3加在开头//bookHistory=2       3     bookHistory=3_2//浏览历史包含id为3的书,将其删除,再添加到开头//bookHistory=2_3     3     bookHistory=3_2//1.得到用户曾经看过的书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){bookHistory = id;return bookHistory;}//bookHistory=1_2_5    代表用户曾经看一些书,接着程序要得到用户曾经看过什么书//先切割成含有id的数组String ids[] = bookHistory.split("_");//为了检测数组中是否包含当前id,我们应该把数据转成集合,并且还要转成链表结构的集合,为了使用addFirst方法与removelast方法LinkedList<String> idList = new LinkedList(Arrays.asList(ids));//如果包含,就移除if(idList.contains(id)){idList.remove(id);}else{//如果不包含且长度够了,就删除最后一个if(idList.size()>=3){idList.removeLast();}}//总之都要在开头添加此ididList.addFirst(id);//再将id与_连接组合形成新的cookies的值,但末尾存在_StringBuffer sb = new StringBuffer();for(String lid: idList){   //1_2_3_sb.append(lid + "_");}//把末尾的_截取return sb.deleteCharAt(sb.length()-1).toString();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

这篇关于cookie案例之显示用户上次浏览过的商品的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040823

相关文章

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2