`
vincent_com
  • 浏览: 42322 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类

cookie 实现历史浏览商品并排序

 
阅读更多
//商品历史浏览记录

public class HistoryCookieUtil {


    private final static String HISTORY_PRE  = "history_"; //Cookie中,历史浏览
    private final static String HISTORY_PATH = "/";  //Cookie中,历史浏览的Cookie的路径


    //清除所有历史浏览记录
    public static void removeAllHistoryCookie(HttpServletRequest request,HttpServletResponse response) {
        Cookie[] cookies = request.getCookies();
        if (null == cookies || cookies.length == 0) {
            return;
        }
        for (Cookie thisCookie : cookies) {
            if (thisCookie.getName().startsWith(HISTORY_PRE)) {
                thisCookie.setMaxAge(0); // 删除这个cookie
                thisCookie.setPath(HISTORY_PATH);
                response.addCookie(thisCookie);
            }
        }
    }

    //清除单个商品的浏览记录
    public static void removeHistoryCookie(HttpServletRequest request,HttpServletResponse response, Long goodsId) {
        if (goodsId == null) {
            return;
        }
        Cookie[] cookies = request.getCookies();
        if (null == cookies || cookies.length == 0) {
            return;
        }
        for (Cookie thisCookie : cookies) {
            if (thisCookie.getName().equals(HISTORY_PRE + goodsId)) {
                thisCookie.setMaxAge(0); // 删除这个cookie
                thisCookie.setPath(HISTORY_PATH);
                response.addCookie(thisCookie);
            }
        }
    }

    //加入单个商品浏览记录到cookie(有效期30天)
    public static void setHistoryCookie(HttpServletRequest request,HttpServletResponse response, Long goodsId) {
        if (goodsId == null) {
            return;
        }
        String nameString = HISTORY_PRE + goodsId.toString();
        Cookie cookie = new Cookie(nameString, goodsId.toString());
        cookie.setPath(HISTORY_PATH);
        cookie.setMaxAge(3600 * 24 * 30); // 30 days
        response.addCookie(cookie);
    }


  
    public static void addHistoryCookie(HttpServletRequest request,HttpServletResponse response,ServletContext servletContext, Long goodsId) {
        if (goodsId == null ) {
            return;
        }
        Integer viewNum = 10;//页面商品显示的个数(默认显示10)
        String thetype = EnumBoardName.toMap().get("browse_history");//汉字表示
        BoardDao boardDao = (BoardDao) getBean(servletContext, "boardDao");
        Board board = boardDao.getBoardByName(thetype);
        if(null != board && null != board.getAmount()){
         viewNum = board.getAmount();
        }
        String nameString = HISTORY_PRE + goodsId.toString();
        Cookie[] cookies = request.getCookies();
        int historyCookieNum = 0;//历史浏览的当前 cookie 数目
        if (null != cookies && cookies.length > 0) {
            for (Cookie thisCookie : cookies) {
                if (thisCookie.getName().startsWith(HISTORY_PRE)) {
                  historyCookieNum++;
                }
            }
        }
        if(historyCookieNum<viewNum){//小于显示数目时候
         String flagexist ="no";//标记cookie中是否存在相同的历史浏览商品
            for (Cookie thisCookie : cookies) {
                if (thisCookie.getName().equalsIgnoreCase(nameString)) {//如果有相同的记录先移去 再加上
                 removeHistoryCookie(request, response, goodsId);
                 setHistoryCookie(request, response, goodsId);
                 flagexist ="yes";
                    break;
                }
            }
            if(flagexist.equals("no")){//cookie中不存在则直接加入cookie
             setHistoryCookie(request, response, goodsId);
            }
        }
        if(historyCookieNum == viewNum){//等于显示数目的时候移去最旧一个记录 加入新的记录
         List<String> list = new ArrayList<String>();//存放当前的历史cookie
            for (Cookie thisCookie : cookies) {
                if (thisCookie.getName().startsWith(HISTORY_PRE)) {//
                 String oldGoodsId = thisCookie.getValue();//
                 list.add(oldGoodsId);
                }
            }
            if(list.contains(goodsId.toString())){//判断(防止详情页面不断刷新调用addcookie方法)
             removeHistoryCookie(request, response, goodsId);
             setHistoryCookie(request, response, goodsId);
            }else{
                for (Cookie thisCookie : cookies) {
                    if (thisCookie.getName().startsWith(HISTORY_PRE)) {//去掉第一条旧的历史记录
                     String oldGoodsId = thisCookie.getValue();//旧的商品ID
                     removeHistoryCookie(request, response, Long.valueOf(oldGoodsId));
                     setHistoryCookie(request, response, goodsId);
                        break;
                    }
                }
            }
        }
        if(historyCookieNum > viewNum){//考虑后台重新设置历史显示数目变小后的情况,历史cookie中存在的数目大于设置显示的数目后要重新获取前viewNum条历史记录
         removeAllHistoryCookie(request, response);//先移除所有历史浏览记录
         int addNewNum = 0 ;
            for (int i=cookies.length-1;i>0;i-- ) {
                if(viewNum == addNewNum){//获取到设置数目的记录后跳出
                 break;
                }
                if (cookies[i].getName().startsWith(HISTORY_PRE)) {
                 String getnewgoodsId = cookies[i].getValue();
                 if(null != getnewgoodsId && getnewgoodsId.length()>0){
                  setHistoryCookie(request, response, Long.valueOf(getnewgoodsId));
                  addNewNum++ ;
                 }
                }
            }
        }

    }

   
    public static List<RankGoods> getHistoryRankList(HttpServletRequest request,ServletContext servletContext) {
        List<RankGoods> list = new ArrayList<RankGoods>();
        Cookie[] cookies = request.getCookies();
        if (null == cookies || cookies.length < 1) {
            return null;
        }
        String thetype = EnumBoardName.toMap().get("browse_history");//汉字表示
        String rankTitle = "历史浏览";//榜行标题
        Integer viewlistNum = 10;//页面商品显示的个数(默认显示10)
        BoardDao boardDao = (BoardDao) getBean(servletContext, "boardDao");
        Board board = boardDao.getBoardByName(thetype);
        if(null != board && null != board.getAmount()){
           viewlistNum = board.getAmount();
         rankTitle = board.getTitle();
        }
        GoodsDao goodsDao = (GoodsDao) getBean(servletContext, "goodsDao");
        int viewHistoryNum = 0 ;
        for (int i=cookies.length-1;i>0;i-- ) {//倒序排列
         if(viewlistNum == viewHistoryNum){//等于后台设置显示数目时不在显示
          break;
         }
            if (cookies[i].getName().startsWith(HISTORY_PRE)) {
                String goodsId = cookies[i].getValue();
                if (goodsId == null || goodsId.trim().length()<1) {
                    continue;
                }
                Long goodsId2 = Long.valueOf(goodsId);
                Goods goods = new Goods();
       try {
         goods = goodsDao.getGoods(goodsId2);
       } catch (Exception e) {
         e.printStackTrace();
       }
                RankGoods hgs = new RankGoods();
                hgs.setGoodsId(String.valueOf(goods.getId()));//商品Id
                ............;
                list.add(hgs);
                viewHistoryNum ++ ;
            }
        }
        return list;
    }

}

分享到:
评论

相关推荐

    asp.net知识库

    清除网页历史记录,屏蔽后退按钮! 如何传值在2个页面之间 :要求不刷新父页面,并且不能用Querystring传值 Asp.net地址转义(分析)加强版 Web的桌面提醒(Popup) Using the Popup Object Click button only once ...

    perl语言脚本文档说明

    16.1.1 Perl的简单发展历史 183 16.1.2 开放源 184 16.1.3 Perl的开发 185 16.2 Perl综合存档文件网 185 16.2.1 什么是CPAN 186 16.2.2 为什么人们愿意提供自己的开 发成果 186 16.3 下一步你要做的工作 187 ...

    perl学习文档

    16.1.1 Perl的简单发展历史 183 16.1.2 开放源 184 16.1.3 Perl的开发 185 16.2 Perl综合存档文件网 185 16.2.1 什么是CPAN 186 16.2.2 为什么人们愿意提供自己的开 发成果 186 16.3 下一步你要做的工作 187 16.3.1...

    PERL编程24学时教程

    16.1.1 Perl的简单发展历史 183 16.1.2 开放源 184 16.1.3 Perl的开发 185 16.2 Perl综合存档文件网 185 16.2.1 什么是CPAN 186 16.2.2 为什么人们愿意提供自己的开 发成果 186 16.3 下一步你要做的工作 187 16.3.1...

    24日学好Perl语言

    16.1.1 Perl的简单发展历史 183 16.1.2 开放源 184 16.1.3 Perl的开发 185 16.2 Perl综合存档文件网 185 16.2.1 什么是CPAN 186 16.2.2 为什么人们愿意提供自己的开 发成果 186 16.3 下一步你要做的工作 187 16.3.1...

    PERL编程24学时教程.pdf

    16.1.1 Perl的简单发展历史 183 16.1.2 开放源 184 16.1.3 Perl的开发 185 16.2 Perl综合存档文件网 185 16.2.1 什么是CPAN 186 16.2.2 为什么人们愿意提供自己的开 发成果 186 16.3 下一步你要做的工作 187 16.3.1...

    C#编程经验技巧宝典

    43 &lt;br&gt;0061 树的实现 44 &lt;br&gt;3.2 排序 48 &lt;br&gt;0062 如何实现选择排序算法 48 &lt;br&gt;0063 如何实现冒泡排序算法 49 &lt;br&gt;0064 如何实现快速排序算法 50 &lt;br&gt;0065 如何实现插入排序算法 ...

    《javaScrip开发技术大全》源代码

    • sample10.htm 遍历对象属性并获得属性值 • sample11.htm 遍历对象属性和方法 • sample12.htm 遍历对象属性和方法时进行判断 • sample13.htm 遍历对象属性值 • sample14....

    Perl编程24学时教程(PDF格式,共24章)

    16.1.1 Perl的简单发展历史 183 16.1.2 开放源 184 16.1.3 Perl的开发 185 16.2 Perl综合存档文件网 185 16.2.1 什么是CPAN 186 16.2.2 为什么人们愿意提供自己的开 发成果 186 16.3 下一步你要做的工作 187 16.3.1...

    perl编程24学时教程.rar

    16.1.1 Perl的简单发展历史 183 16.1.2 开放源 184 16.1.3 Perl的开发 185 16.2 Perl综合存档文件网 185 16.2.1 什么是CPAN 186 16.2.2 为什么人们愿意提供自己的开 发成果 186 16.3 下一步你要做的工作 187...

    Asp.Net Forums 2 v1.1 源代码.zip

    完全公开源代码,并无任何限制许可 易于安装的系统和应用功能 易于安装 完全基于WEB的后台管理 100%的asp.net的代码,没有COM,java或者其他的格式 支持多国语言:简体中文,繁体中文,英语,法语,德国,日语及其他任何...

    视觉搜索「Visual Search」-crx插件

    ”到目前为止,广告商利用用户的网站历史记录和计算机Cookie来标识要显示的广告。这些机制常常代表过去发生的事情,通常代表消费者已经完成的搜索或购买。图像分析可以对未来的购买进行建模,并且像行为分析一样具有...

    苹果8XPC和手机二合一完整版

    MAC.Cookie.Set(name,value,days) 设置cookie的值; name=cookie名称,value=cookie值,days=过期时间 MAC.Cookie.Get(name) 获取cookie的值; name=cookie名称 MAC.Cookie.Del(name) 删除cookie的值; name=cookie名称 ...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP...

    JavaScript笔记

    JavaScript常用于实现如下功能: |--控制文档的外观和内容; |--对浏览器的控制; |--与 HTML 表单的交互; |--与用户的交互; |--执行计算等。 1.单击事件:定义在按钮的开始标签中 语法:onclick="js语句...

Global site tag (gtag.js) - Google Analytics