问答详情
源自:8-8 使用Cookie实现保存商品浏览记录

请教下Cookie问题。

   String list ="";
              //从客户端获得Cookies集合
              Cookie[] cookies = request.getCookies();
              //遍历这个Cookies集合
              if(cookies!=null&&cookies.length>0)
              {
	              for(Cookie c:cookies)
	              {
	                  if(c.getName().equals("ListViewCookie"))
	                  {
	                     list = c.getValue();
	                  }
	              }
	          }
              
              list+=request.getParameter("id")+",";
              //如果浏览记录超过1000条,清零.
              String[] arr = list.split(",");
              if(arr!=null&&arr.length>0)
              {
                  if(arr.length>=1000)
                  {
                      list="";
                  }
              }
              Cookie cookie = new Cookie("ListViewCookie",list);
              response.addCookie(cookie);
if(cookies!=null&&cookies.length>0)
              {
	              for(Cookie c:cookies)
	              {
	                  if(c.getName().equals("ListViewCookie"))
	                  {
	                     list = c.getValue();
	                  }
	              }
	          }
              
              list+=request.getParameter("id")+",";

这段代码不太懂,c.getName().equals("ListViewCookie")中的“ListViewCookie”在第一次开始遍历的时候是不存在的对吗?因为在最后才创建了

 Cookie cookie = new Cookie("ListViewCookie",list);

这个cookie对象。如果我第一次点击了id为1的商品

也就是说第一次遍历的时候 list=“1,”。

等到如果我第二次我点击了id为2的时候

list=“1,沃特篮球鞋,2”;

是酱紫吗?

提问者:慕田峪7021683 2016-11-22 15:42

个回答

  • Airly
    2016-11-23 11:10:38
    已采纳

    我建议你实在理不清就这样理解。 

    假设代码是这样执行的:

    --------------------------------第一次执行-------------------------------------------------------

    String list ="";

    list+=request.getParameter("id")+",";   //这里相当于就是获取商品的id值并添加到字符串中

                  //如果浏览记录超过1000条,清零.

                  String[] arr = list.split(",");     

                  if(arr!=null&&arr.length>0)

                  {

                      if(arr.length>=1000) 

                      {

                          list="";

                      }

                  }

     //设置一个cookie,名为ListView,值为list (而这里的list就是上面的request.getParameter("id")即商品的id)

                  Cookie cookie = new Cookie("ListViewCookie",list);

                  response.addCookie(cookie);


    --------------------------------第二次执行-------------------------------------------------------

     //从客户端获得Cookies集合

                  Cookie[] cookies = request.getCookies();

                  //遍历这个Cookies集合

                  if(cookies!=null&&cookies.length>0)

                  {

                      for(Cookie c:cookies)

                      {

                    //匹配是否有名为ListViewCookie的cookie

                    if(c.getName().equals("ListViewCookie")) 

                          {

                             list = c.getValue();  //匹配到后获取cookie的值,覆盖原来的字符串。

                          }

                      }

                  }

    所以有可能你最后获得的list就是“2,5,6,10,12,”只是商品的id而已,没有商品的名称...只用id即可确定某条具体信息。

  • Airly
    2016-11-23 10:55:20

    我始终觉得你是以为代码始终就是从上到下执行,原本这是代码的执行方式没错,但是第一段代码并没有满足条件,所以会直接执行第2段,而下一次执行才会执行第1段,然后第2段

  • Airly
    2016-11-23 01:11:35

    cookie本身是有生命周期的,即有个过期时间。

    下面这段代码的用途是来判断是否有匹配的cookie,如果有,执行这行代码   list = c.getValue();

     Cookie[] cookies = request.getCookies();

                  //遍历这个Cookies集合

                  if(cookies!=null&&cookies.length>0)

                  {

                      for(Cookie c:cookies)

                      {

                          if(c.getName().equals("ListViewCookie"))

                          {

                             list = c.getValue();

                          }

                      }

                  }

    如果没有,则上面这段代码将不被执行,直接执行下面这段代码

     list+=request.getParameter("id")+",";

                  //如果浏览记录超过1000条,清零.

                  String[] arr = list.split(",");

                  if(arr!=null&&arr.length>0)

                  {

                      if(arr.length>=1000)

                      {

                          list="";

                      }

                  }

                  Cookie cookie = new Cookie("ListViewCookie",list);

                  response.addCookie(cookie);


    实际上项目第一次被执行的时候是先执行的第2段代码,然后第二次才是执行的第1段代码

    ---------------------------------------------------------------------------------------------------

    至于cookie里面存的值:

    举个例子,当我点击的id为1的商品, 则list=“1,”;

                            点击id为2的商品,则list ="1,2,";

    因为 list+=request.getParameter("id")+","; 等同于 list = list + request.getParameter("id")+","

    即重新覆盖原来字符串的意思。


  • aaaaaaaaten
    2016-11-22 16:36:57

    Cookie[] cookies = request.getCookies();

                  //遍历这个Cookies集合

                  if(cookies!=null&&cookies.length>0)

                  {

                      for(Cookie c:cookies)

                      {

                          if(c.getName().equals("ListViewCookie"))

                          {

                             list = c.getValue();

                          }

                      }

                  }else{

                        Cookie cookie = new Cookie("ListViewCookie",list);

                        response.addCookie(cookie);

                     }


  • aaaaaaaaten
    2016-11-22 16:34:50

    c.getName().equals("ListViewCookie"),这段代码是查找ListViewCookie,前面有条件 if(cookies!=null&&cookies.length>0),

    Cookie cookie = new Cookie("ListViewCookie",list); response.addCookie(cookie);

    这段代码应该放在前面if语句接else里面。

    代码错了


  • 慕田峪7021683
    2016-11-22 15:58:23

    不对,第二次的话应该是list="1,沃特篮球鞋2,"。

    也就是说正确的话应该到第二次的时候list="沃特篮球鞋1,安踏运动鞋2"

    但还是不懂。