Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】(六)

简介: 基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话.
  • 接收id,找到用户想要看哪一本书,输出该书的详细信息
 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/>");

点击想要的书籍。

31.jpg得到书籍的详细信息

32.jpg

  • 既然用户点击了书籍,那么服务器就应该颁发Cookie给浏览器,记住用户点击了该书籍
  • 现在问题来了,Cookie的值应该是什么呢?试想一下,待会还要把浏览过的书籍显示出来,所以用书籍的id是最好不过的。想到了用书籍的id作为Cookie的值,我们还要定义一些规则!
  • 我们可能有非常多的书籍,不可能把用户浏览过的书籍都显示出来。所以我们定义只能显示3本浏览过的书籍
  • 书籍的id都是数字,如果不做任何修改,存到Cookie里边可能就是231,345,123此类的数字,这样取出某一个id的时候就十分费劲并且后面还要判断该书是否存在Cookie里边了,所以我们要把存储到Cookie的书籍id分割起来。所以我们定义”_“作为分隔符
  • 按上面的应用,我们的逻辑应该是:先遍历下Cookie,看下有没有我们想要的Cookie。如果找到想要的Cookie,那就取出Cookie的值
 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();
            }
        }
  • 取出了Cookie的值也分几种情况
  1. Cookie的值为null【直接把传入进来的id当做是Cookie的值】
  2. Cookie的值长度有3个了【把排在最后的id去掉,把传进来的id排在最前边】
  3. Cookie的值已经包含有传递进来的id了【把已经包含的id先去掉,再把id排在最前面】
  4. Cookie的值就只有1个或2个,直接把id排在最前边
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);
            }
        }

这么折腾完了,我们的Cookie值就在LinkedList集合里边了。接下来,我们要做的就是把集合中的值取出来,拼接成一个字符串

 StringBuffer stringBuffer = new StringBuffer();
        //遍历LinkedList集合,添加个下划线“_”
        for (String s : linkedList) {
            stringBuffer.append(s + "_");
        }
        //最后一个元素后面就不需要下划线了
        return stringBuffer.deleteCharAt(stringBuffer.length() - 1).toString();

好的,我们现在已经完成了Cookie值了。接下来设置Cookie的生命周期,回送给浏览器即可

 String bookHistory = makeHistory(request, id);
        Cookie cookie = new Cookie("bookHistory", bookHistory);
        cookie.setMaxAge(30000);
        response.addCookie(cookie);

既然我们已经把Cookie回送给浏览器了。那么接下来我们就在首页上获取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;
            }
        }

好的,我们来试验一下吧!!,第一次访问首页,并没有浏览过的商品

33.jpg

当我点击javaweb书籍再访问首页的时候

34.jpg

再点击ajax然后访问首页

35.jpg

再点击javaweb然后访问首页

36.jpg

点击oracle然后访问首页

37.jpg

  • 好的,经过测试,该程序应该没有什么问题了!

如果文章有错的地方欢迎指正,大家互相交流。


目录
相关文章
|
JSON API 数据格式
亚马逊商品评论API接口技术指南
亚马逊商品评论API可程序化获取指定ASIN商品的用户评价,包含评分、内容、时间等结构化数据。需企业认证并遵守使用协议,日调用上限500次。支持分页与排序查询,适用于竞品分析、口碑监测等场景,结合SP-API可构建完整电商数据方案。(238字)
1088 3
|
JSON 缓存 算法
如何通过API获取1688商品类目数据:技术实现指南
1688开放平台提供alibaba.category.get接口,支持获取全量商品类目树。RESTful架构,返回JSON数据,含类目ID、名称、层级等信息。需注册账号、创建应用并授权。请求需签名认证,QPS限10次,建议缓存更新周期≥24小时。
1181 2
|
JSON 算法 API
1688比价API接口:实现商品价格高效比较的技术指南
本文介绍1688比价API的核心功能与实战应用,涵盖接口调用、Python代码实现及价格比较算法优化。助您快速集成商品比价功能,提升电商开发效率。
1535 3
|
JSON 安全 API
淘宝天猫上货API接口技术指南
本文介绍淘宝天猫上货API,详解其RESTful接口原理、认证流程及Python调用示例。涵盖商品添加、签名生成、响应处理,并提供代码实现与最佳实践,助力开发者高效实现自动化批量上架。
1351 3
|
缓存 数据可视化 定位技术
快递鸟快递API技术指南:获取物流轨迹信息与轨迹地图的解决方案
在当今电商竞争激烈的环境中,物流体验已成为提升用户满意度的关键因素。研究表明,超过 75% 的消费者会因物流信息不透明而放弃下单。
2464 1
|
JSON 安全 API
1688批量上货API接口技术指南
本文介绍1688批量上货API的集成与使用,涵盖认证、请求构建及错误处理。通过Python示例代码,助您实现商品信息批量上传,提升电商运营效率。
1149 1
|
JSON API 开发者
1688按关键词搜索商品的API接口技术指南
本文介绍如何使用1688开放平台API实现商品关键词搜索,涵盖API概述、权限申请、调用步骤、Python代码示例及注意事项,助力开发者高效集成商品搜索功能,适用于电商自动化、价格监控等场景,内容基于官方文档,确保准确可靠。
1597 0
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
1183 156
|
存储 前端开发 Java
【SpringMVC】——Cookie和Session机制
获取URL中参数@PathVarible,上传文件@RequestPart,HttpServerlet(getCookies()方法,getAttribute方法,setAttribute方法,)HttpSession(getAttribute方法),@SessionAttribute
1032 11
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
2047 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header