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

相关文章

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr